快速介绍:问题是关于UTF-8
vs UTF-16
。
*我尽量保持简短,具体,请耐心等待。
我知道特定问题的变化很多UTF-8/16
没有提到全局编码主题,
这是我提问的开始(ANSI
vs UNICODE
),我想这不仅仅是* MY *任务,
因为它可以为c ++ 中的许多其他(表现积极的)初学者提供服务。
更具体 - 重点:
提供以下环境参数:
WINDOWS
platform C++
和C#
*让我们说这是一个常量。
我可以使用UTF-8(UTF-16的一半大小)和“侥幸逃脱”吗?
...节省空间和时间
TLDR
我最近转向使用C++
,在过去的几天里我一直试图决定如何处理字符串,这是最昂贵的数据类型之一,我已经关注了几乎所有关于编码的着名和不太知名的文章问题,虽然我试图继续搜索更多的困惑我已经变得,关于兼容性,同时保持高性能应用程序而不跨越*框架的边界
我使用了术语框架,但我计划通过I/O
执行大部分Native c++
我可以使用UTF-8吗?我想要UTF-8,我知道一件事!
windows'blood'类型是UTF-16,虽然我认为低级别I/O
和HTTP
使用/默认/偏好/优惠来自UTF-8
但我在Windows上并且仍在使用.NET
我可以使用什么来最大化我的应用程序性能,查询操作保存到数据库...
答案 0 :(得分:1)
这是我为回答你的问题所做的研究汇编:
根据维基百科,Unicode希伯来语块从U + 0590扩展到U + 05FF,从U + FB1D扩展到U + FB4F(我不知道比例): https://en.wikipedia.org/wiki/Unicode_and_HTML_for_the_Hebrew_alphabet
根据维基百科,再次,cyrrilic可以在以下bolrs中找到:U + 0400-U + 04FF,U + 0500-U + 052F,U + 2DE0-U + 2DFF,U + A640-U + A69F ,U + 1D2B,U + 1D78,U + FE2E-U + FE2F https://en.wikipedia.org/wiki/Cyrillic_script_in_Unicode
UTF-16可以用两个字节表示以下字形:U + 0000到U + D7FF和U + E000到U + FFFF,这意味着上面的所有字符都用两个字节表示(Windows上的wchar_t)。
要表示Herbew和Cyrillic,UTF-8总是需要至少两个字节,可能还需要三个字节:
你自己说过:Windows的DNA是UTF-16。无论妄想网站声称什么,WinAPI都不会改为UTF-8,因为从微软的角度来看这是不合理的(打破与以前的Windows应用程序的兼容性只是为了让Linux爱好者高兴吗?说真的吗?)。
当您在Windows下开发时,所有Unicode都将针对UTF-16进行优化/设计。
即使WinAPI中的“char”API只是一个包装器,它会在调用您应该直接调用的UTF-16之前将您的char字符串转换为wchar_t字符串。
由于您的问题似乎主要是I / O,您应该尝试查看读取/写入/发送/接收UTF-16与UTF-8与样本数据之间是否存在有意义的差异。
从上面的每一个事实来看,我看到UTF-8和UTF-16(俄语和西里尔字母)之间的中性选择(*),或选择导致UTF-16(窗口)。
所以,我自己的结论,除非你的测试显示不是这样,否则将坚持使用Windows上的UTF-16。
(*)您可以使用您正在使用的所有语言中的几个字符串进行采样,并尝试使用最常用字符的平均值进行统计。
现在,代替你,我会避免在Windows上直接使用wchar_t。
相反,我会使用Windows提供的_T()
,TCHAR
和<tchar.h>
宏/ typedef / include机制:只定义了一些宏(UNICODE
和{ {1}}如果内存服务),以及一些智能重载,你可以:
如果您切换到另一个操作系统,这将使您的代码更具可移植性。
答案 1 :(得分:0)
请阅读这篇文章
http://www.joelonsoftware.com/articles/Unicode.html
请仔细阅读。
现在关于表现我非常怀疑你会发现任何不同之处。 您可以根据程序的用途选择编码。
它应该与其他程序通信吗?
您是否将信息存储在数据库中,以供其他人访问?
在决定使用哪种编码时,性能和磁盘空间不是您的首要任务。