给定编码中的文本文档或字符串,例如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 位在这两个字节中表示为110xxxxx
2 10xxxxxx
2,其中1
&0
被规定,并且x
是来自码点的一位。换句话说,
- 第一个字节 =
0xc0
+X, - 第二个字节 =
0x80
+y, 在哪里 - X和y是码点除以 2 6 =时的商和余数
0x40
,即高 10 位(其中 5 位非零)和低 6 位。
由于组合锐音符号的代码点是 U+0301,因此它的位的0011 00
00 0001
含义X=0x0c
和y= 0x01
,所以用字节来表示0xcc 0x81
。相似地,
西里尔字母“Á” → U+0410 →
0100 00
01 0000
→0x10 0x10
→0xd0 0x90
。
西里尔字母“а́” → U+0430 →0100 00
11 0000
→0x10 0x20
→0xd0 0xb0
。
这与转储输出不一致,但是
拉丁语“Á” → U+00C1 →
0000 11
00 0001
→0x03 0x01
→0xc3 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)