From ef8027484a82ebe94cde145c25eccf2b19557b03 Mon Sep 17 00:00:00 2001 From: barnold Date: Tue, 19 Mar 2024 18:30:30 -0400 Subject: [PATCH] Add item about counting characters. --- A-with-dots.png | Bin 0 -> 19714 bytes barnold.css | 17 ++++++++ index.html | 113 +++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 115 insertions(+), 15 deletions(-) create mode 100644 A-with-dots.png create mode 100644 barnold.css diff --git a/A-with-dots.png b/A-with-dots.png new file mode 100644 index 0000000000000000000000000000000000000000..c54be7a1b828e938963cbfcd665a36d9de778d21 GIT binary patch literal 19714 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 u8#E^3+i?86WABCTgrmFj9 -barnold's tilde.club page - + + + barnold's tilde.club page + + + - -

~~~barnold's tilde.club page~~~

+ +

Counting characters

+ +2024-03-19 + +

Recently I tried to learn myself a little UTF-8. My guide was +Markus Kuhn's +FAQ. Its discussion of "combining characters" made sense to +me. These are "code points", in UTF-8 speak, that identify a sort of +decoration applied to the preceding character. The FAQ compared two +examples. The first is "LATIN CAPITAL LETTER A WITH DIAERESIS". This +is a "precomposed character", i.e. you get the capital A and its +little dotted hat together as a single unit. +

+The second example is the same character conceptually, but represented +by two code points: "LATIN CAPITAL LETTER A" followed +by "COMBINING DIAERESIS". The first one give you a plain capital A and +the second one means "go back to the last character and put two little +dots on top, kthxbai". This combining form is apparently to be +preferred because of its greater flexibility. You don't need to define +every possible combination of plain letter plus decorator (or +"diacritical mark" as the jargon has it). +

+ Here's a summary of the code points, their encoding in UTF-8 and the result as rendered by your browser. +

+ + + + + + + + + + + + + + + + + + + + +
Code point name, valueBytes (hex)Rendering
LATIN CAPITAL LETTER A WITH DIAERESIS, U00C4xc3, x84Ä
LATIN CAPITAL LETTER A, U0041x41
COMBINING DIAERESIS, U0308xcc, x88
+ +

+ Under that Rendering column, you should see the same characters as + below (shown as an image in case your browser renders the characters + differently), +

+ +

+ except I added single quotes around each character, just to show + there was no peculiar white space appearing. I typed those printf + commands in a urxvt terminal emulator running on my laptop, while + connected to a bash shell in tilde.club. The "\xNN" in printf is a + handy sequence to output a byte with the hex value of NN. +

+ What I'm trying to get at with the table and the image is that you + should end up with the self same visible character, + or glyph in UTF-8 speak, whichever of the two methods you + use. In theory you shouldn't be able to tell apart the "precomposed" + (one code point) character from the "composed" (two code point) + character, short of running od(1) or the like. + +

+ Theory and practise are a little different. +

+

+barnold@tilde$ printf "\xc3\x84" | wc --chars
+1
+barnold@tilde$ printf "\x41\xcc\x88" | wc --chars
+2
+ +

+ Though the two forms of "A with a diaeresis" are in principle one + and the same character, wc(1) thinks that the combining form + has two characters, not just one. According to + Markus Kuhn's FAQ, "A combining character is not a full character by + itself" so we have a contradiction here. (You might wonder, if it + isn't a character why did they call it a + "combining character"? I have no answer to that.) +

+ The maintainers of + GNU coreutils + don't regard wc's count of 2 as a bug (I asked on the mailing list) + so it's unlikely to change. After decades of effort in computer + science the question "what's the character count of this string?" + doesn't necessarily have a clear answer. +

Best commit message of the year (so far)

2024-01-06