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

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

快速介绍:问题是关于 UTF-8UTF-16

*我已尽最大努力使其尽可能简短和具体,请耐心等待。

我知道特定问题 UTF-8/16 有无数种变体,但没有提到全局编码主题, 这是我提问的开始(ANSI vs UNICODE),我想这不仅仅是 *MY* 的追求, 因为它可以为许多其他(性能驱动的)c++ 初学者提供服务

更具体 - 切中要点:

给出以下环境参数:

  • WINDOWS 平台
  • C++C#
  • 使用一些英语 /俄语/希伯来语

*假设这是一个常数。

我可以使用 UTF-8(UTF-16 的一半大小)并“摆脱它”吗?

...节省空间和时间

TLDR 我最近转而使用 C++,在过去的几天里,我试图决定如何处理字符串,这是要处理的最昂贵的数据类型之一,我几乎关注了所有著名和不太知名的文章在编码问题上,尽管我尝试继续搜索的次数越多,我变得越困惑,关于兼容性,同时保持高性能应用程序而不会跨越*框架的边界

尽管我计划通过Native c++ 完成大部分I/O,但我使用了框架这个术语 我可以使用 UTF-8 吗?我想要 UTF-8 吗,我知道一件事!

windows 'blood' 类型是 UTF-16,虽然我认为 Low Level I/OHTTP 使用/defaults/prefers/benefits from UTF-8

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

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

a point 我读过一本不太出名的书[article]

最佳答案

一些研究

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

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

根据维基百科,Unicode 希伯来语 block 从 U+0590 延伸到 U+05FF,从 U+FB1D 延伸到 U+FB4F(我不知道比例): https://en.wikipedia.org/wiki/Unicode_and_HTML_for_the_Hebrew_alphabet

再次根据维基百科,西里尔字母可以在以下 block 中找到: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 字节

window

您自己说过: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) 之间做出选择。

因此,我自己的结论是,除非您的测试另有说明,否则在 Windows 上坚持使用 UTF-16。

(*) 您可以对您正在使用的所有语言的几个字符串进行采样,并尝试统计最常用字符的平均使用情况。

奖金?

现在,代替您,我将避免在 Windows 上直接使用 wchar_t。

相反,我会使用 _T() , TCHAR<tchar.h> Windows 提供的 macro/typedef/include 机制:只定义了几个宏(UNICODE_UNICODE 如果没记错的话),以及一些智能重载,您可以:

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

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

关于c# - 性能编码 UTF 8/16 处理 Char[]/char*/std::string/BSTR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33276736/

相关文章:

c# - 如何轻松地将 C++ 代码添加到 Unity 项目中?

c# - 与错误代码 : 10413 集成的购物车运费

c# - 调用页面但没有出现

c++ - 是否可以代理任何功能

performance - "Fast Integer Multiplication Using Modular Arithmetic"(2008) 算法什么时候比 Schönhage-Strassen 算法快?

c# - 尝试通过 TCP 传输 2 路音频?

python - 打印 Python 和 C++ double 时的精度差异

java - 更改 shared_ptr 的 getCPtr() 可见性

javascript - Pg-promise 性能提升 : ON CONFLICT

java - 在对更新字段进行计算时更有效地更新表