Unicode 如何在C++;?

Unicode 如何在C++;?,unicode,hex,Unicode,Hex,我有一些关于Unicode的问题,在const char*中打印转义的十六进制值 据我所知,utf-8包括2、3或4字节字符,范围从英镑符号到汉字字符。在字符串中,这些字符串以十六进制值表示,使用\u作为转义序列。我还了解到,在字符串中使用十六进制转义时,可以包含在转义中的值的字符将被包括在内。例如,“abc\x0f0dab”将把0f0dab作为十六进制包含在\x中,即使您只希望考虑0f0d 现在,在编写Unicode字符串时,假设您想编写“abc我想您可能不熟悉编码的概念,因为您阅读了您的文章

我有一些关于Unicode的问题,在
const char*
中打印转义的十六进制值

  • 据我所知,utf-8包括2、3或4字节字符,范围从英镑符号到汉字字符。在字符串中,这些字符串以十六进制值表示,使用\u作为转义序列。我还了解到,在字符串中使用十六进制转义时,可以包含在转义中的值的字符将被包括在内。例如,“abc\x0f0dab”将把0f0dab作为十六进制包含在\x中,即使您只希望考虑0f0d

  • 现在,在编写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