如何检查文本文档的 Unicode 编码

如何检查文本文档的 Unicode 编码

给定编码中的文本文档或字符串,例如UTF-8,找出代表我看到的字符的 Unicode 编码的最简单方法是什么?

我想找出使用​​了哪些代码点,特别是对于几乎相同的字符,例如 Á(拉丁文)和 А́(西里尔文)。我还想知道它们是如何转换为UTF-8的。我应该更喜欢在编辑器中工作的方法,例如kate,但命令行替代方案也是可以接受的。

我尝试过的

我尝试过运行文本od -xc,但意识到这并不是很有帮助,因为UTF-8编码重新排列字节之间的位。下面的案例研究说明了重音西里尔元音的情况是多么费力。

我使用包含许多有用的 Unicode 字符的文本文档来进行剪切和粘贴,我发现这种格式比通常的格式更方便字符映射表程序供应,我通常将其打开在kate.由于我想检查此类文件中的编码,因此编辑器中的选项会很有用。

我希望什么

当我在 VMS 上使用可编程编辑器 TPU 时,可以很简单地对其进行编程以添加一个功能,以在文本行下显示另外两行,显示文件字节的垂直排列的十六进制代码(具有适当的制表符间距) 。这将是一种有用的可能性,尽管对于 UTF-8 来说最多需要 8 行。

另一种可能性是选择一个字符并具有弹出一个窗口的功能,该窗口显示用于生成该字符的代码点和/或如何通过 UTF-8 将这些代码点转换为字节。在这种情况下,人们可以显示更多信息,但对于视觉扫描较长文本的细节来说不太有用。

代替编辑器的功能,人们可以拥有一种新的格式或其od衍生形式。

案例研究:俄语重音元音

我目前正在学习俄语,想要输入带有重音符号的西里尔字母。我从维基词典等来源收集了带重音的俄语元音(例如波波鲁加伊),给我这段文字:

Á á Ó ó É é У́ ý И́ и́ Ы́ ы́ Э́ э́ Ю́ ю́ Я́ я́

我收集自这个答案对于我下面的问题1,这些重音元音必须使用 来表示U+0301 COMBINING ACUTE ACCENT。当我运行这个程序时od -tx1 -tc -w26-tc因此出现空格,宽度 26 适合这个网站),我得到的是:

0000000  c3  81  20  c3  a1  20  c3  93  20  c3  b3  20  c3  89  20  c3  a9  20  d0  a3  cc  81  20  c3  bd  20
        303 201     303 241     303 223     303 263     303 211     303 251     320 243 314 201     303 275    
0000032  d0  98  cc  81  20  d0  b8  cc  81  20  d0  ab  cc  81  20  d1  8b  cc  81  20  d0  ad  cc  81  20  d1
        320 230 314 201     320 270 314 201     320 253 314 201     321 213 314 201     320 255 314 201     321
0000064  8d  cc  81  20  d0  ae  cc  81  20  d1  8e  cc  81  20  d0  af  cc  81  20  d1  8f  cc  81  0a
        215 314 201     320 256 314 201     321 216 314 201     320 257 314 201     321 217 314 201

Kate告诉我我的文件采用 UTF-8 格式(在 下Tools Encoding Unicode)。 UTF-8 表示西里尔字符和组合重音符号,因为它们位于 U+0080..U+07FF 范围内,为 2 个字节;对于这样的码点,最低 11 位在这两个字节中表示为110xxxxx2 10xxxxxx2,其中1&0被规定,并且x是来自码点的一位。换句话说,

  • 第一个字节 = 0xc0+X,
  • 第二个字节 = 0x80+y, 在哪里
  • Xy是码点除以 2 6 =时的商和余数0x40,即高 10 位(其中 5 位非零)和低 6 位。

由于组合锐音符号的代码点是 U+0301,因此它的位的0011 00 00 0001含义X=0x0cy= 0x01,所以用字节来表示0xcc 0x81。相似地,

西里尔字母“Á” → U+0410 → 0100 00 01 00000x10 0x100xd0 0x90
西里尔字母“а́” → U+0430 → 0100 00 11 00000x10 0x200xd0 0xb0

这与转储输出不一致,但是

拉丁语“Á” → U+00C1 → 0000 11 00 00010x03 0x010xc3 0x81

所以我保存的Á á Ó ó É é实际上是拉丁语,因为所有六个只使用两个字节,所以没有组合重音!


笔记

1 我曾在如何在 KDE 中输入带重音符号的俄语字符?。答案让我意识到我想要这个问题中描述的功能。

答案1

Emacs

C-x =( M-x what-cursor-position)例如,在屏幕底部显示有关当前字符的代码点信息

Char: И (1048, #o2030, #x418, file ...) point=7 of 8 (75%) column=0

C-u C-x =打开一个包含更多信息的窗口,包括代码点、字节表示、有关 Unicode 字符的元数据、用于显示字符的字体等。

             position: 7 of 8 (75%), column: 0
            character: И (displayed as И) (codepoint 1048, #o2030, #x418)
    preferred charset: unicode (Unicode (ISO10646))
code point in charset: 0x0418
               script: cyrillic
               syntax: w    which means: word
             category: .:Base, L:Left-to-right (strong), Y:2-byte Cyrillic, c:Chinese, h:Korean, j:Japanese, y:Cyrillic
             to input: type "C-x 8 RET HEX-CODEPOINT" or "C-x 8 RET NAME"
          buffer code: #xD0 #x98
            file code: #xD0 #x98 (encoded by coding system utf-8-unix)
              display: by this font (glyph code)
    xft:-DAMA-Ubuntu Mono-normal-normal-normal-*-17-*-*-*-m-0-iso10646-1 (#x2CB)
         Unicode data:
                 Name: CYRILLIC CAPITAL LETTER I
             Category: Letter, Uppercase
      Combining class: Lu
        Bidi category: Lu
             Old name: CYRILLIC CAPITAL LETTER II
            Lowercase: и

Character code properties: customize what to show
  name: CYRILLIC CAPITAL LETTER I
  old-name: CYRILLIC CAPITAL LETTER II
  general-category: Lu (Letter, Uppercase)
  decomposition: (1048) ('И')

[back]

命令行

unicode实用程序(在某些发行版中可用,例如 Debian/Ubuntu/...,或与pip3 install unicode) 显示有关一个或多个 Unicode 字符的信息。请注意,如果您从编辑器复制粘贴,该编辑器可能会对剪贴板进行与文件不同的编码。

$ unicode И
U+0418 CYRILLIC CAPITAL LETTER I
UTF-8: d0 98 UTF-16BE: 0418 Decimal: И Octal: \02030
И (и)
Lowercase: 0438
Category: Lu (Letter, Uppercase)
Bidi: L (Left-to-Right)

相关内容