Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ UTF-8 Unicode编码和特定于国家/地区的字符_C++_Windows_Unicode_Utf 8_Char - Fatal编程技术网

C++ UTF-8 Unicode编码和特定于国家/地区的字符

C++ UTF-8 Unicode编码和特定于国家/地区的字符,c++,windows,unicode,utf-8,char,C++,Windows,Unicode,Utf 8,Char,我对编码有点迷茫。我不明白我们为什么说“UTF-8 Unicode”。对我来说,“Unicode”听起来像世界上所有可能的字符,它不适合一个单字节字符 你能给我解释一下吗 第二个问题:如果我决定在程序中使用单字节字符和“UTF-8 Unicode”编码,我是否能够处理大多数欧洲字符?俄罗斯人、阿拉伯人、中国人等呢 感谢您的帮助。UTF-8仅对某些字符使用单字节-基本的西方字母、数字和标点符号。其他字符占用多个字节 像“Hello world!”这样的简单英文字符串每个字符需要一个字节。包括一个重

我对编码有点迷茫。我不明白我们为什么说“UTF-8 Unicode”。对我来说,“Unicode”听起来像世界上所有可能的字符,它不适合一个单字节字符

你能给我解释一下吗

第二个问题:如果我决定在程序中使用单字节字符和“UTF-8 Unicode”编码,我是否能够处理大多数欧洲字符?俄罗斯人、阿拉伯人、中国人等呢


感谢您的帮助。

UTF-8仅对某些字符使用单字节-基本的西方字母、数字和标点符号。其他字符占用多个字节

像“Hello world!”这样的简单英文字符串每个字符需要一个字节。包括一个重音字符,如“Café”,该字符将占用多个字节


文章的“描述”部分描述得很好。

根据维基百科

Unicode是一种计算行业标准,用于对世界上大多数书写系统中表示的文本进行一致的编码、表示和处理

UTF-8是Unicode的一部分,它描述了一种编码。它可以在Unicode标准中对所有~1000000个字符进行编码。之所以有“8”,是因为每个字符都使用8位的倍数进行编码


例如,“A”在十六进制中编码为“41”,“é”是“c3a9”,以及猫" 是“E7 8C AB”。

在下文中,我使用术语“字符”来表示可以在屏幕上显示并由计算机打印在纸上的东西。Unicode的官方名称是“代码点”。字母“a”是一个代码点-它是“字符”编号97(0x61),a也是ྦྷ' (字符4007,0xfa7)

Unicode本身对这个星球上已知的每种语言中的每一个已知字符进行编码。编码从传统的英语/美国字符开始,在前128个字符(0..127)中使用控制字符。接下来的128个字符包括一系列欧洲字母,如重音字符和元音字符(é,Ä,ö)还有一些特殊字符(英镑、欧元等)。然后更高的数字包括“非欧洲”语言,如俄语、日语、汉语、泰语、乌尔都语、阿拉伯语、希伯来语等[我不确定它们的确切顺序]

数字上百万

例如,您可以查看不同的字符

UTF-8每个“令牌”使用8位。前128个字符直接编码为0..127。其他所有字符都以11xxxxxx二进制开头。第一个字符实际上告诉您还有多少个字符(最多5个),在开头使用越来越多的1,随后的每个字符都被编码为10xxxxxx。最后一个“这是特殊字符”和“实际数据”之间总是有一个0。因此,例如,一个2字节的组合将有11*0*xxxxx 10yyyyyyy,其中xxxxx yyyyyyy是字符的二进制代码


UTF-16的工作原理完全相同,只是每个“令牌”都是16位。在UTF-16中,编码“长于16位”编码的范围是0xD800 DFFF。你可以在维基百科的文章中阅读更多内容(我对UTF-16不太熟悉).

谢谢你的回答,但是我会为E7 8C AB使用什么类型的字符呢?wchar\u t在windows上只有2个字节。@Virus721:对字符串使用
char
unsigned char
数组。对代码点使用
int
unsigned int
。@Virus721,windows上的wchar\u t是UTF-16而不是UTF-8。单个Unicode码点最多可占用2个UTF-16字符。我认为区分Unicode代码点(最终映射到一个字符)和Unicode代码单元(根据编码方式——UTF-8、UTF-16、UTF-32——可能需要多个代码单元才能构成一个代码点)很重要.code point=>unicode表中的索引,code unit=表示字符代码的字节集,对吗?您分析的句子不正确。“编码”不会修改“UTF-8 unicode”。“UTF-8”修改“unicode编码”。从来没有人说“UTF-8 unicode”,这毫无意义。谢谢,现在更清楚了!…“unicode”“赋予数字以意义。“UTF-8”是一种将数字序列表示为字节流的方法。因此,UTF-8可以(但不必)用于以字节流的形式传输Unicode代码点。但是,更一般地说,UTF-8(或者更确切地说,它的基本汤普森方案)只是一种以可变宽度的方式序列化整数的简洁方法,在这种方式中,较小的值占用更少的空间,并且支持最多36位的值(尽管Unicode只需要21位)。谢谢您的完整答案。那么,我如何才能将这样一个字节数组与一个需要常规字符串(如fopen())的函数一起使用呢?要么
fopen
理解
utf-8
,然后您只需将其传入即可。或者它没有,在这种情况下,您将获得“垃圾”作为文件名(然后它将一次对每个字节进行编码,因此您将获得0xC3 0xA0在“普通”编码中编码的内容)。当然,它还依赖于以后显示该名称时能够显示UTF-8字符的任何内容。