性能编码UTF 8/16处理Char [] / char * / std :: string / BSTR

时间:2015-10-22 08:39:40

标签: c# c++ performance utf-8 character-encoding

快速介绍:问题是关于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/OHTTP使用/默认/偏好/优惠来自UTF-8

我在Windows上并且仍在使用.NET

我可以使用什么来最大化我的应用程序性能,查询操作保存到数据库...

a point 我读过一篇名不见经传的[article]

2 个答案:

答案 0 :(得分:1)

一些研究

这是我为回答你的问题所做的研究汇编:

Unicode中的希伯来语和西里尔语

根据维基百科,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-8与UTF-16

UTF-16可以用两个字节表示以下字形:U + 0000到U + D7FF和U + E000到U + FFFF,这意味着上面的所有字符都用两个字节表示(Windows上的wchar_t)。

要表示Herbew和Cyrillic,UTF-8总是需要至少两个字节,可能还需要三个字节:

  • U + 0000 - U + 007F:1个字节
  • U + 0080 - U + 07FF:2个字节
  • U + 0800 - U + FFFF:3个字节

你自己说过: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}}如果内存服务),以及一些智能重载,你可以:

  • 在Windows上使用wchar_t和utf-16
  • 在Linux上使用utf-8

如果您切换到另一个操作系统,这将使您的代码更具可移植性。

答案 1 :(得分:0)

请阅读这篇文章

http://www.joelonsoftware.com/articles/Unicode.html

请仔细阅读。

现在关于表现我非常怀疑你会发现任何不同之处。 您可以根据程序的用途选择编码。

它应该与其他程序通信吗?

您是否将信息存储在数据库中,以供其他人访问?

在决定使用哪种编码时,性能和磁盘空间不是您的首要任务。