Unicode 如何在C++;?
我有一些关于Unicode的问题,在Unicode 如何在C++;?,unicode,hex,Unicode,Hex,我有一些关于Unicode的问题,在const char*中打印转义的十六进制值 据我所知,utf-8包括2、3或4字节字符,范围从英镑符号到汉字字符。在字符串中,这些字符串以十六进制值表示,使用\u作为转义序列。我还了解到,在字符串中使用十六进制转义时,可以包含在转义中的值的字符将被包括在内。例如,“abc\x0f0dab”将把0f0dab作为十六进制包含在\x中,即使您只希望考虑0f0d 现在,在编写Unicode字符串时,假设您想编写“abc我想您可能不熟悉编码的概念,因为您阅读了您的文章
const char*
中打印转义的十六进制值
现在,在编写Unicode字符串时,假设您想编写“abc我想您可能不熟悉编码的概念,因为您阅读了您的文章 例如,你说“unicode of…”。。。₤是0x00A3”。这是真的-unicode代码点U+00A3是磅符号。但0x00A3不是表示磅符号的方式,例如,UTF-8(unicode的一种特殊常见编码)。拿a来看看我的意思。正如您所看到的,U+00A3的UTF-8编码是两个字节,即
0xc2
,0xa3
(按该顺序)
在调用printf()
和屏幕上出现某些内容之间会发生一些事情
首先,您的程序运行代码printf(“abc\x0fdef”)
,这意味着以下字节按顺序写入程序的标准输出:
0x61, 0x62, 0x63, 0x0f, 0x64, 0x65, 0x66
注意:我假设您的源代码是ASCII(或UTF-8),这是非常常见的。我相信,从技术上讲,源代码字符集的解释是由实现定义的
现在,为了查看输出,您通常会在某种shell中运行此程序,它最终必须将这些字节转换为可视字符。它通过使用编码来实现这一点。同样,ASCII兼容是常见的,例如UTF-8。在Windows上,CP1252是常见的
如果是这种情况,您将得到以下映射:
0x61 - a
0x62 - b
0x63 - c
0x0f - the 'shift in' ASCII control code
0x64 - d
0x65 - e
0x66 - f
这将打印为“abcdef”,因为“移入”控制代码是非打印字符
注意:上面的内容可能会根据所涉及的确切字符集而变化,但ASCII或UTF-8很可能是您正在处理的内容,除非您有一个特殊的设置
如果您有与UTF-8兼容的终端,以下内容应打印出“abc₤def”,作为开始使用的示例:
printf("abc\xc2\xa3def");
有道理吗
更新:回答您评论中的问题:您需要区分代码点和该代码点编码的字节值 Unicode标准定义了“码点”,它是字符的数值。这些码点通常写为U+XYZ,其中XYZ是十六进制值。 例如,字符U+219e为。 这也可能写为0x219e。您可以从上下文中知道编写器正在谈论一个代码点 当您需要对该代码点进行编码时(打印或保存到文件等),您使用的是一种编码,例如UTF-8。注意,如果您使用这种编码,则每个代码点都与编码值完全对应。因此,在UTF-32中,代码点U+219e实际上将被简单地编码为0x219e。但其他编码方式会有所不同。UTF-8将U+219e编码为三个字节
0xE2 0x86 0x9E
最后,
\x
表示法就是如何在C/C++带引号的字符串中写入任意字节值。如果我在C源代码中写入“\xff”
,那么内存中的字符串将是两个字节0xff 0x00
(因为它会自动获得一个空终止符)。。。。它将打印abcdef。“您的C编译器没有遵循规范。”unicode的。。。₤为0x00A3“₤不是一个磅符号
它是里拉符号
U+20A4
哇,太棒了!!!你说得对。我可能应该启用utf-8编码。请你试着回答我的第二个问题。“\x”和“0x”与“U+”有什么区别?@vishwasmanjunah:我在我的答案末尾补充了一些信息,希望能澄清这一点。太好了,我至少了解了很多。没有多少ppl对编码很了解。总而言之:U+XYZ只是一个定义为表示unicode的值,但当将其存储在内存中时,每个编码都有不同的方式,UTF-8将其存储为0xA 0xB 0xC,假设a、B和C等于一个字节\x用于按原样将值(十六进制值)写入内存,以便编译器不会将其误认为是字符,并将其转换为ascii。\x 0x可以是U+并且可以互换吗?unicode U+219e的含义可以表示为0x219e和\x219e,而在字符串中使用0xE2 0x86 0x9E可以写为\xE2\x86\x9E。(我确信你不能写为U+E2 U+86 U+9E)@vishwasmanjunah:一般来说,选择\x、0x或U+取决于上下文。它们并不总是可以互换的。在C字符串中,只有\x
有意义(也有\u
,但那是另一回事)。在字符串之外,但仍在C源代码中,0x
具有含义。就以对话的方式谈论unicode,我见过使用U+
和0x
编写的代码点,但几乎从未使用\x
。