{"id":138,"date":"2026-08-31T22:00:00","date_gmt":"2026-08-31T13:00:00","guid":{"rendered":"https:\/\/sr-works.net\/blog-en\/?p=138"},"modified":"2026-08-30T21:26:44","modified_gmt":"2026-08-30T12:26:44","slug":"the-day-utf8conv-was-born-vs-code-wasnt-lying-and-the-mojibake-wouldnt-go-away","status":"publish","type":"post","link":"https:\/\/sr-works.net\/blog-en\/the-day-utf8conv-was-born-vs-code-wasnt-lying-and-the-mojibake-wouldnt-go-away\/","title":{"rendered":"The Day utf8conv Was Born \u2014 VS Code Wasn&#8217;t Lying, and the Mojibake Wouldn&#8217;t Go Away"},"content":{"rendered":"\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><em>This article was originally written in Japanese and translated into English with AI assistance. Please note that some expressions may carry nuances from the original Japanese.<\/em><\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><em><a href=\"https:\/\/note.com\/sr_works\/n\/n799f508e6646\">\ud83c\uddef\ud83c\uddf5 \u65e5\u672c\u8a9e\u7248\u306f\u3053\u3061\u3089 \/ Japanese version<\/a><\/em><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Series: utf8conv Development Journal (Part 1)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Starting with this installment, I&#8217;m beginning the development journal for another product that grew up alongside DataMigrator: &#8220;utf8conv&#8221; (UC for short).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">utf8conv is a very simple GUI tool that does nothing more than batch-converting files saved in a non-UTF-8 encoding into UTF-8. The name is exactly what it sounds like: &#8220;utf-8 converter.&#8221; Unlike DataMigrator, there&#8217;s no lengthy design document behind it, and in scale the two aren&#8217;t remotely comparable \u2014 utf8conv is much smaller.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Still, being small didn&#8217;t mean it was easy. Right from day one I ran into a compatibility problem between uv and tkinter that ate half a day, and partway through I struggled under a &#8220;zero additional packages&#8221; constraint I&#8217;d set for myself \u2014 there were a fair number of stumbles along the way.<br>This first installment starts with the story of why I decided to build this tool in the first place.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">While Talking with Claude, Mojibake Was Quietly Happening<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Around February 2026, alongside developing DataMigrator, I was also doing other work while chatting with Claude \u2014 tweaking HTML files here and there, tidying up old documents, that kind of miscellaneous task.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One day, in the middle of asking Claude for advice on something, I found a garbled file on my PC. Opening it, the Japanese parts had turned into something like &#8220;\u8b41?\uff6d\u601c\u55a7\u7e3a&#8221; \u2014 a string of symbols that unmistakably screamed &#8220;the character encoding is broken.&#8221; Having used a Mac for 20 years, this kind of mojibake is a familiar sight I&#8217;d run into more than a few times.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Normally I&#8217;d have shrugged it off with an &#8220;ugh, again&#8221; and dealt with it however. But this time, since I happened to be in the middle of migrating data from my old iMac to a MacBook Pro, and had Claude on hand to ask, I tried &#8220;How do I fix this file?&#8221; Claude&#8217;s answer was straight out of the textbook: &#8220;The original file is probably saved in a different encoding, like Shift-JIS. Please re-save it as UTF-8 in VS Code.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So I did as told: opened it in VS Code, chose &#8220;Save with Encoding&#8221; \u2192 UTF-8, saved it, and reopened it in the browser.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2014It didn&#8217;t fix it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On screen, the mojibake was still dancing around, unchanged. VS Code&#8217;s own status bar at the bottom said &#8220;UTF-8,&#8221; so the file was surely UTF-8 now. When I told Claude, &#8220;I saved it but it&#8217;s still not fixed,&#8221; Claude thought for a moment and suggested, &#8220;Try explicitly specifying the encoding again when you reopen and save it.&#8221; I tried that too. Still no fix.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At this point, doubts were starting to creep in: &#8220;Is this a VS Code bug?&#8221; &#8220;Is the AI telling me something wrong?&#8221; Doubting one or the other is one thing, but once you start doubting both at once, you lose your footing entirely.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">So, What Is a Character Encoding, Anyway?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Let me back up for a moment and lay out some groundwork.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Inside a computer, every character is stored as numbers \u2014 a sequence of bytes. The rule for how to read that byte sequence and map it to characters is what we call a &#8220;character encoding.&#8221; There isn&#8217;t just one such rule; many have been created over the years, for different languages and eras \u2014 Shift-JIS or EUC-JP for Japanese, GBK for Chinese, CP1252 for Western European languages, and today&#8217;s standard, UTF-8.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The same character will produce a different byte sequence depending on which rule you use. Put the other way around: read the same byte sequence under a different rule, and you get something completely different. That&#8217;s mojibake.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s actually try it. Take a string saved under one language&#8217;s character encoding, then read it as if it were a different language&#8217;s encoding, and here&#8217;s what you get:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Below, a Japanese file is read as Chinese (GBK), a Chinese file as Japanese (EUC-JP), and a German file as Cyrillic (CP1251).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Japanese \u3053\u3093\u306b\u3061\u306f \u6587\u5b57\u5316\u3051     \u2192  \u5059\u50ab\u5075\u506a\u507c \u66a5\u5e24\u58d4\u5057\nChinese  \u4f60\u597d \u4e16\u754c \u7f16\u7801          \u2192  \u4f4e\u632b \u5f0a\u9806 \u5712\u9df9\nGerman   Gr\u00fc\u00dfe Stra\u00dfe Fu\u00dfball  \u2192  Gr\u044c\u042fe Stra\u042fe Fu\u042fball<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Look at the German example. <code>Gr\u00fc\u00dfe<\/code> has become <code>Gr\u044c\u042fe<\/code>. The alphabetic letters survive intact; only the characters carrying an umlaut or an eszett break, turning into Cyrillic letters. Unlike the Japanese case, where the whole string turns unreadable, here only part of it corrupts. Exactly which parts the two rules share, and which parts differ, shows up directly in the result.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And the mojibake that opened this article runs in the opposite direction. Take something saved in UTF-8 and read it as if it were Shift-JIS, and you get this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Japanese \"mojibake\" (\u6587\u5b57\u5316\u3051)  \u2192  \u8b41\u87c4\u601c\u55a7\u7e3a<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In both directions, the file itself isn&#8217;t broken. The byte sequence is intact, safely saved exactly as it was. What&#8217;s broken is the &#8220;how to read it.&#8221;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Cause: A Mismatch Between the Byte Sequence and the Declaration<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Digging into the cause together with Claude, here&#8217;s what it eventually turned out to be.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The problem file was an HTML file. HTML files carry a declaration line near the top of the file that says, in effect, &#8220;this file is written in this encoding&#8221; \u2014 specifically, something like <code>&lt;meta charset=\"Shift_JIS\"&gt;<\/code>. The browser sees this declaration and decides, &#8220;ah, then I&#8217;ll read it as Shift-JIS.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When you choose &#8220;Save with Encoding: UTF-8&#8221; in VS Code, the file&#8217;s contents \u2014 the actual byte sequence \u2014 really are converted to UTF-8. VS Code isn&#8217;t lying about that part. But the line that says <code>&lt;meta charset=\"Shift_JIS\"&gt;<\/code> is left exactly as it was.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s because an editor&#8217;s &#8220;save with a different encoding&#8221; feature converts the file&#8217;s byte sequence \u2014 it doesn&#8217;t read the document&#8217;s contents and rewrite them. So the string <code>&lt;meta charset=\"Shift_JIS\"&gt;<\/code> just gets stored, unchanged, inside a UTF-8-encoded file.<br>And I don&#8217;t think that&#8217;s careless of the editor \u2014 I think it&#8217;s the correct behavior. An editor that took it upon itself to rewrite the body text because &#8220;this declaration doesn&#8217;t seem to match reality, so I&#8217;ll fix it for you&#8221; would be far more alarming.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Still, the upshot is that the file is left holding nothing but a contradiction.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The result is a mismatch like this: the file&#8217;s actual contents are UTF-8. But the top of the file declares &#8220;this is Shift-JIS.&#8221; The browser trusts the declaration first. Believing it&#8217;s Shift-JIS, it tries to interpret the UTF-8 byte sequence as Shift-JIS. Naturally, the result isn&#8217;t meaningful Japanese. That result is the mojibake from the start of this article.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The moment I heard this explanation, two thoughts rose up in me at once: &#8220;I see,&#8221; and &#8220;wait, couldn&#8217;t this be turned into a tool?&#8221; The problem I&#8217;d run into was probably one that plenty of VS Code users out there, somewhere, had also run into \u2014 and given that it even included the situation of &#8220;an AI kindly walking you through the wrong fix,&#8221; it seemed like something with real reproducibility. In particular, since I was already building DataMigrator, a product for organizing and migrating data files, with the underlying premise of getting file migration between my own Macs properly sorted out, I was going to need to correctly interpret the encodings of a large, disorganized pile of files anyway. That&#8217;s also where requirements like being able to do a dry run in advance, actually changing the encoding properly, handling a large number of files at once, and having a safety net to revert if needed, all found their way into the spec.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To begin with, a tool that just batch-converts files from non-UTF-8 to UTF-8 is the kind of thing that could reasonably have existed for a long time already. But one that&#8217;s a GUI, needs no extra installation, can safely do a dry run (check only), and correctly rewrites HTML\/XML declarations too \u2014 all of that together \u2014 I couldn&#8217;t find, within the range I searched.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">By the way, this problem \u2014 mojibake caused by a mismatch between the declaration and the actual encoding \u2014 wasn&#8217;t limited to browsers. The same thing happens in the Quick Look preview you get on macOS Finder by selecting a file and pressing the space bar. I confirmed this later by making four test files.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A file whose contents are UTF-8 but whose declaration says &#8220;Shift-JIS&#8221; \u2014 garbled, even in Quick Look. A file where both the contents and the declaration are UTF-8 \u2014 readable. One where both are Shift-JIS \u2014 also readable. And a file with the declaration removed entirely \u2014 readable, correctly.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In other words, Quick Look can actually work out the right answer just by looking at the contents. Yet even though it can work it out, when a declaration is present, it trusts the declaration instead and breaks. It displays correctly only when there&#8217;s no declaration at all \u2014 a slightly perverse result.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">From here on, this is less about character encoding itself and more about how the software is built. Software that handles character encodings is, for the most part, built to &#8220;auto-detect by default, but let you choose manually if needed.&#8221; Browsers work this way too. But the lightweight preview feature built into the OS \u2014 the one that doesn&#8217;t even count as launching an app, that opens instantly when you select a file \u2014 doesn&#8217;t seem to have that manual entry point anywhere. Maybe it exists somewhere if I looked hard enough. But the act of hunting for it is a hassle in itself, and even if I found the setting and changed it, some other encoding would stop displaying correctly instead \u2014 which would defeat the purpose.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Rather than fiddling with the display side to fix it, fix the file itself. That, in the end, is what utf8conv is trying to do.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">UC&#8217;s Direction<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">And so, right as DataMigrator&#8217;s M1 wrapped up, another small project \u2014 &#8220;utf8conv&#8221; \u2014 got underway.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I wrote a requirements document for it too, but it never grew past 30-plus chapters the way DataMigrator&#8217;s did. It&#8217;s a modest requirements document, running to just a few chapters at most. Even so, I settled a few important policies right at the start.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The first was &#8220;zero additional packages&#8221; \u2014 a constraint that everything had to be done using nothing but Python&#8217;s standard library. I initially considered using a well-known library called <code>chardet<\/code> for encoding detection, but I judged that skipping chardet would buy me benefits like &#8220;it runs the moment it&#8217;s installed,&#8221; &#8220;no dependency headaches,&#8221; and &#8220;distribution stays simple.&#8221; Detection accuracy might suffer a little as a result, but I figured I&#8217;d make up for that with the &#8220;try encodings in order from the top&#8221; approach described later.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The second was &#8220;dry run first.&#8221; By default, the tool doesn&#8217;t convert anything \u2014 it just runs in a mode that logs what would happen if you converted, and only performs an actual conversion once the user explicitly chooses &#8220;really convert.&#8221; Just like DataMigrator&#8217;s &#8220;never delete&#8221; philosophy, this leans toward the safe side. Since undoing a character-encoding conversion once it&#8217;s done is a hassle, I judged that a confirm-first mechanism was indispensable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The third was &#8220;automatic backups.&#8221; When an actual conversion runs, the pre-conversion file is automatically moved into a backup folder. Even if a user chooses to skip the dry run and go straight to a real conversion, having a backup means they can still roll back \u2014 a last line of defense.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Written out, these three policies come to only three lines, but they ended up defining utf8conv&#8217;s character down the line.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">On Day One, uv and tkinter Get Into a Fight<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Once the requirements document was done, I started actually moving my hands in Claude Code. Same as with DataMigrator: create the project&#8217;s box, spin up a Python environment, get a minimal GUI showing \u2014 that route. For the GUI, in keeping with the zero-additional-packages policy, I decided to use tkinter from Python&#8217;s standard library.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But when I tried to run it, the window wouldn&#8217;t open. The error wasn&#8217;t particularly helpful either \u2014 all I got back was a message to the effect of &#8220;Tcl\/Tk not found.&#8221;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Having Claude Code dig into it, the cause became clear. uv (the Python environment manager I&#8217;d adopted during DataMigrator&#8217;s M1) ships its own Python binaries, and those binaries don&#8217;t bundle Tcl\/Tk \u2014 the GUI library tkinter relies on internally. The Python that uv distributes is, strictly speaking, &#8220;just the Python interpreter&#8221; \u2014 it doesn&#8217;t include GUI-related extra runtimes. That&#8217;s a reasonable design choice on uv&#8217;s part, but it&#8217;s a trap if you&#8217;re trying to use tkinter.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The fix was to install Python and python-tk via Homebrew, then rebuild uv&#8217;s virtual environment on top of that Homebrew Python. Written as commands, the flow looks roughly like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>brew install python@3.12 &amp;&amp; brew install python-tk@3.12\nuv venv --python \/opt\/homebrew\/bin\/python3.12<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Written down, it&#8217;s only a couple of lines, but it took about half a day of trial and error to pin down the cause. Neither uv nor tkinter is at fault \u2014 it&#8217;s the specific combination that&#8217;s unusual, the kind of problem that&#8217;s genuinely hard to reach on a first encounter.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Still, this experience paid off later. From then on, every Python project with a GUI \u2014 both utf8conv and DataMigrator \u2014 got standardized on this &#8220;uv virtual environment built on Homebrew Python&#8221; setup, and I never ran into the same problem again. One more piece of experience banked, so I wouldn&#8217;t hit the same wall twice.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The End of Day One<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">By the end of day one, a directory structure suited to software development was in place, and the source file <code>utf8_converter_gui.py<\/code> was up and running.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Launching <code>utf8_converter_gui.py<\/code> opened a tkinter window. The conversion logic itself was already written by this point. I could already select which file extensions to target for conversion, and there was already an &#8220;add custom extension&#8221; input field where I could add my own. On top of that, the GitHub Actions test automation was running, and the first push to the private repository was done.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That said, the current source code has the conversion logic and the GUI mixed together in a single file. In this shape, there&#8217;s no way to pull out just the conversion logic and verify it on its own. In fact, the only test I managed to write that day was a single one checking whether the version number could be read correctly. Splitting these apart so each piece could be tested individually \u2014 that became the next day&#8217;s homework.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Oddly enough, I didn&#8217;t get the same heavy sense of &#8220;taking the first big step into a large development effort&#8221; that I&#8217;d felt when M1 wrapped up on DataMigrator. utf8conv&#8217;s first day felt lighter than that \u2014 more like an oddly optimistic &#8220;maybe this&#8217;ll be done in three days.&#8221; Maybe it&#8217;s because the smaller scope let me picture the finished product right away.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And in fact, utf8conv&#8217;s development would go on to produce a working MVP within a genuine handful of days after this. Three days including a weekend, six chat sessions (U1 through U6), and all the features were implemented \u2014 that was the pace. Along the way, I went through a few design decisions that pushed a bit further than typical vibe coding, like &#8220;separate the core from the GUI,&#8221; &#8220;put the latin-1 fallback last,&#8221; and &#8220;write tests as data instead of code.&#8221; I&#8217;ll get into those starting next time.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Coming Up Next<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Next time is the story of utf8conv&#8217;s second day (session U2). As of day one, the conversion logic and the GUI were still mixed together in one file. Since that makes it impossible to write tests (you can&#8217;t check the logic without launching the GUI), I end up separating the core (logic) from the GUI (screen). Changing a design for the sake of &#8220;so we can write tests&#8221; was, for me, a first. Along the way, I also get into an idea called the &#8220;latin-1 fallback,&#8221; for implementing character-encoding detection using nothing but Python&#8217;s standard library.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">About Soul Resonant Works<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Soul Resonant Works is a solo venture developing seven local AI systems.<br>Starting from zero programming experience, the development is progressing through collaboration with AI.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83c\udf10 Soul Resonant Works:<br>\u2192 <a href=\"https:\/\/sr-works.net\/en\/index.html\">https:\/\/sr-works.net\/en\/index.html<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udcdd This blog publishes the entire development process as a serialized journal.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">CubePlot (free version available)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">CubePlot is the first product from Soul Resonant Works \u2014 it turns a CSV into a 3D scatter plot you can rotate and zoom. No install, no sign-up: it&#8217;s a single HTML file you open in your browser, and it works offline. CubePlot itself does not send the data you load outside your machine \u2014 external network traffic is blocked at the browser level (CSP). Start with the free version.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u25b6 Product page: <a href=\"https:\/\/sr-works.net\/en\/cubeplot\/\">https:\/\/sr-works.net\/en\/cubeplot\/<\/a><br>\u25b6 Get it (commercial license, USD $39 + tax where applicable): <a href=\"https:\/\/soulworks8.gumroad.com\/l\/pzcij\">https:\/\/soulworks8.gumroad.com\/l\/pzcij<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">If you found this article useful, please share it.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This article was originally written in Japanese and translated into English with AI assistance. Please note that some expressions may carry nuances from the original Japanese. \ud83c\uddef\ud83c\uddf5 \u65e5\u672c\u8a9e\u7248\u306f\u3053\u3061\u3089 \/ Japanese version Series: utf8conv Development Journal (Part 1) Starting with this installment, I&#8217;m beginning the development journal for another product that grew up alongside DataMigrator: &#8220;utf8conv&#8221; [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-138","post","type-post","status-publish","format-standard","hentry","category-ai-development-journal"],"_links":{"self":[{"href":"https:\/\/sr-works.net\/blog-en\/wp-json\/wp\/v2\/posts\/138","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sr-works.net\/blog-en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sr-works.net\/blog-en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sr-works.net\/blog-en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sr-works.net\/blog-en\/wp-json\/wp\/v2\/comments?post=138"}],"version-history":[{"count":3,"href":"https:\/\/sr-works.net\/blog-en\/wp-json\/wp\/v2\/posts\/138\/revisions"}],"predecessor-version":[{"id":140,"href":"https:\/\/sr-works.net\/blog-en\/wp-json\/wp\/v2\/posts\/138\/revisions\/140"}],"wp:attachment":[{"href":"https:\/\/sr-works.net\/blog-en\/wp-json\/wp\/v2\/media?parent=138"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sr-works.net\/blog-en\/wp-json\/wp\/v2\/categories?post=138"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sr-works.net\/blog-en\/wp-json\/wp\/v2\/tags?post=138"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}