oops
diff --git a/src/lib9/fmt/dofmt.c b/src/lib9/fmt/dofmt.c
index 74697eb..e4e32bf4 100644
--- a/src/lib9/fmt/dofmt.c
+++ b/src/lib9/fmt/dofmt.c
@@ -252,9 +252,17 @@
 		return __fmtcpy(f, "<nil>", 5, 5);
 	/* if precision is specified, make sure we don't wander off the end */
 	if(f->flags & FmtPrec){
+#ifdef PLAN9PORT
 		i = 0;
 		for(j=0; j<f->prec && s[i]; j++)
 			i += chartorune(&r, s+i);
+#else
+		/* ANSI requires precision in bytes, not Runes */
+		for(i=0; i<f->prec; i++)
+			if(s[i] == 0)
+				break;
+		j = utfnlen(s, i);	/* won't print partial at end */
+#endif
 		return __fmtcpy(f, s, j, i);
 	}
 	return __fmtcpy(f, s, utflen(s), strlen(s));
diff --git a/src/lib9/fmt/fmtquote.c b/src/lib9/fmt/fmtquote.c
index 5b8f9fd..8c8daae 100644
--- a/src/lib9/fmt/fmtquote.c
+++ b/src/lib9/fmt/fmtquote.c
@@ -91,6 +91,11 @@
 		/* advance output */
 		q->nbytesout += w;
 		q->nrunesout++;
+
+#ifndef PLAN9PORT
+		/* ANSI requires precision in bytes, not Runes. */
+		nin-= w-1;	/* and then n-- in the loop */
+#endif
 	}
 }
 
diff --git a/src/lib9/fmt/runevseprint.c b/src/lib9/fmt/runevseprint.c
index d789cbe..24e2f17 100644
--- a/src/lib9/fmt/runevseprint.c
+++ b/src/lib9/fmt/runevseprint.c
@@ -20,6 +20,7 @@
 	f.farg = nil;
 	f.nfmt = 0;
 	VA_COPY(f.args,args);
+	fmtlocaleinit(&f, nil, nil, nil);
 	dofmt(&f, fmt);
 	VA_END(f.args);
 	*(Rune*)f.to = '\0';
diff --git a/src/lib9/fmt/vseprint.c b/src/lib9/fmt/vseprint.c
index 0f7ba9d..1b92d2a 100644
--- a/src/lib9/fmt/vseprint.c
+++ b/src/lib9/fmt/vseprint.c
@@ -19,6 +19,7 @@
 	f.farg = nil;
 	f.nfmt = 0;
 	VA_COPY(f.args,args);
+	fmtlocaleinit(&f, nil, nil, nil);
 	dofmt(&f, fmt);
 	VA_END(f.args);
 	*(char*)f.to = '\0';