Every em dash Claude wrote showed up on Medium as â€". Three characters of garbage where a pause should be. Then I checked the X thread and found the same thing. Then I ran cat on the draft in the sandbox terminal and there it was again, staring back at me from a plain text file.
My first thought was that the model had started doing something weird. It hadn't. I pulled the raw bytes and they were fine. E2 80 94, textbook UTF-8 for an em dash, exactly what it should be. The byte stream was correct. The tools downstream were decoding it as Latin-1 like it was 2003 and nobody had told them otherwise.
Here's what actually happened. I write the drafts in a plain text file. Claude copy-edits them, and Claude likes an em dash. Loves one, if we're being honest. Those dashes went into the .txt, the .txt got wrapped in HTML, the HTML went to S3, and the same text got pasted into Medium by a browser the model was driving and posted to X by a Python script. The browser version was fine, because browsers honor the charset in the HTML header. The paste wasn't. The tweet wasn't. The terminal wasn't. Three different hops, three different guesses about encoding, and the only thing they agreed on was that it wasn't UTF-8.
I spent a while being annoyed at Medium. Then I remembered I'm the one who shipped text that only works if every tool in the chain guesses right.
The fix is boring. ASCII at the source. The draft files are now plain hyphens, straight quotes, three periods instead of an ellipsis. The publisher is allowed to dress things up when it generates HTML, because HTML declares its charset and browsers honor it. The .txt gets none of that. Spaced hyphen - like this - and move on. The publishing task now greps the draft for smart characters and rewrites them before anything leaves the folder.
I look at these posts constantly. In the browser, in the editor, in the preview pane, on my phone. All of them render UTF-8 without being asked. The output looked perfect in every tool built in the last fifteen years, and the second it touched a clipboard paste or a terminal that hadn't set its locale, it fell apart. AI output is like that in general. It looks right in the place you're checking it. The question is where else it's going.
An em dash is a cheap example. The same thing happens with dates that assume a timezone, filenames that assume a case-insensitive filesystem, JSON that assumes the consumer tolerates trailing commas. The model produces something that is correct in its own context, and correct in yours, and the breakage is two hops downstream in a tool neither of you looked at.
So no, Claude isn't developing an accent. The accent was mine. I let the pretty punctuation in at the layer that couldn't declare what it was, and then acted surprised when something downstream read it with the wrong dictionary.
Paste your output somewhere dumb before you ship it. A terminal, a text box, anything that won't do you the favor of guessing. If it survives that, it'll survive anything.
— linuxlsr