UTF-8,UTF-16和UTF-32有什么区别?
我知道他们都将存储Unicode,并且每个都使用不同的字节数来表示字符.选择一个优于另一个是否有优势?
我从未明白UTF-16编码的重点.如果您需要能够将字符串视为随机访问(即代码点与代码单元相同),则需要UTF-32,因为UTF-16仍然是可变长度的.如果你不需要这个,那么与UTF-8相比,UTF-16似乎是一种巨大的空间浪费.UTF-16优于UTF-8和UTF-32有什么优势?为什么Windows和Java将它用作本机编码?
utf16或utf32?我正在尝试以多种语言存储内容.某些语言使用双宽字体(例如,日语字体通常是英文字体的两倍).我不确定我应该使用哪种数据库.有关这四个字符集之间差异的任何信息......
可能重复:
为什么UTF-32存在而每个字符只需要21位?
UTF-32中的最大Unicode代码点为0x10FFFF.UTF-32有21个信息位和11个多余的空白位.那么为什么没有UTF-24编码(即删除了高字节的UTF-32)用于存储3个字节而不是4个字节的每个代码点?
如果你有一个网站要翻译成世界上的每种语言,因此有一个包含所有这些翻译的数据库,哪种字符编码最好?UTF-128?
如果是这样,所有浏览器都了解所选的编码?字符编码是直接实现还是有隐藏因素?
提前致谢.
我在Jon Skeet的博客上看到了这篇文章,他谈到了字符串翻转.我想尝试他自己展示的例子,但它似乎有效...这让我相信我不知道如何创建一个包含代理对的字符串,这实际上会导致字符串反转失败.如何实际创建一个带有代理对的字符串,以便我自己可以看到失败?
我已经阅读了很多文章,以便知道Unicode代码点的最大数量是多少,但我没有找到最终答案.
据我所知,Unicode代码点被最小化,使得所有UTF-8 UTF-16和UTF-32编码都能够处理相同数量的代码点.但是这个代码点的数量是多少?
我遇到的最常见的答案是Unicode代码点在0x000000到0x10FFFF(1,114,112代码点)的范围内,但我还在其他地方读过它是1,112,114个代码点.那么要给出一个数字还是比这更复杂的问题?
我一直在探索C++ 11的新Unicode功能,虽然其他C++ 11编码问题非常有用,但我对cppreference的以下代码片段有疑问 .代码写入然后立即读取以UTF-8编码保存的文本文件.
// Write
std::ofstream("text.txt") << u8"z\u6c34\U0001d10b";
// Read
std::wifstream file1("text.txt");
file1.imbue(std::locale("en_US.UTF8"));
std::cout << "Normal read from file (using default UTF-8/UTF-32 codecvt)\n";
for(wchar_t c; file1 >> c; ) // ?
std::cout << std::hex << std::showbase << c << '\n';
Run Code Online (Sandbox Code Playgroud)
我的问题非常简单,为什么循环中wchar_t需要for?一个u8文本字符串可以使用一个简单的声明char *和UTF-8编码的位布局应告诉系统字符的宽度.似乎有一些从UTF-8到UTF-32的自动转换(因此wchar_t),但如果是这种情况,为什么转换是必要的?
Google App Engine使用Python 2.5.2,显然启用了UCS4.但GAE数据存储区在内部使用UTF-8.所以,如果你存储U '\ ud834\udd0c'(长2)到数据存储,当你找回它,你会得到 '\ U0001d10c'(长度为1).我试图计算字符串中unicode字符的数量,以便在存储它之前和之后给出相同的结果.因此,在收到字符串之前,我会尝试将字符串规范化(从u'\ ud834\udd0c'到'\ U0001d10c'),然后再计算其长度并将其放入数据存储区.我知道我可以将其编码为UTF-8然后再次解码,但是有更简单/有效的方法吗?
所以我遇到了一些字符编码问题.当我将以下两个字符放入UTF32编码的文本文件中时:
?
Run Code Online (Sandbox Code Playgroud)
然后在它们上运行此代码:
System.IO.StreamReader streamReader =
new System.IO.StreamReader("input", System.Text.Encoding.UTF32, false);
System.IO.StreamWriter streamWriter =
new System.IO.StreamWriter("output", false, System.Text.Encoding.UTF32);
streamWriter.Write(streamReader.ReadToEnd());
streamWriter.Close();
streamReader.Close();
Run Code Online (Sandbox Code Playgroud)
我明白了:
?
?
Run Code Online (Sandbox Code Playgroud)
(相同的字符两次,即输入文件!=输出)
一些可能有用的东西:第一个字符的十六进制:
15 9E 02 00
而对于第二个:
15 9E 00 00
我正在使用gedit创建文本文件,使用单声道用于C#,我正在使用Ubuntu.
如果我指定输入或输出文件的编码也没关系,如果它是UTF32编码,它就不喜欢它.如果输入文件是UTF-8编码,它可以工作.
输入文件如下:
FF FE 00 00 15 9E 02 00 0A 00 00 00 15 9E 00 00 0A 00 00 00
这是一个错误,还是仅仅是我?
谢谢!