c++ - 字符集如何存储在字符串和 wstrings 中?

标签 c++ string unicode utf-8 wstring

因此,我一直在尝试对字符串和 wstring 进行一些研究,因为我需要了解它们如何为我正在创建的程序工作,所以我还研究了 ASCII 和 unicode,以及 UTF-8 和 UTF -16.

我相信我对这些工作原理的概念有很好的理解,但我仍然遇到问题的是它们实际上是如何存储在“char”、“string”、“wchar_t”和“wstring”中的。

所以我的问题如下:

  1. char 和 wchar_t 使用哪种字符集和编码?这些类型是否仅限于使用这些字符集/编码?
  2. 如果它们不限于这些字符集/编码,如何决定将什么字符集/编码用于特定的 char 或 wchar_t?例如,它是在编译时自动决定的,还是我们必须明确告诉它要使用什么?
  3. 根据我的理解,UTF-8 在使用集合中的前 128 个代码点时使用 1 个字节,但在使用代码点 128 及以上时可以使用超过 1 个字节。如果是这样,这是如何存储的?例如,如果它只使用 1 个字节,它是否只是简单地与 ASCII 存储相同?类型(char 或 wchar_t 或其他)如何知道它使用了多少字节?
  4. 最后,如果我的理解是正确的,我就会明白为什么 UTF-8 和 UTF-16 不兼容,例如。在需要 wstring 的地方不能使用 string。但是在需要 wstring 的程序中,编写一个从字符串到 wstring 的转换函数并在需要 wstring 使我的代码完全基于字符串时使用它,或者只在需要的地方使用 wstring 会更好吗?

谢谢,如果我的任何问题措辞不正确或使用了错误的术语,请告诉我,因为我正在尽力解决这个问题。

顺便说一句,我在用 C++ 工作

最佳答案

  1. 他们使用您想要的任何字符集和编码。这些类型并不意味着特定的字符集或编码。它们甚至不暗示字符——您可以愉快地用它们做数学题。不要那样做,这很奇怪。

  2. 如何输出文本?如果是控制台,则控制台决定哪个字符与每个值相关联。如果它是某种图形工具包,则由该工具包决定。控制台和工具包往往符合标准,因此现在它们很有可能使用 unicode。在旧系统上,任何事情都可能发生。

  3. UTF8 与 ASCII 具有相同的值,范围为 0-127。除此之外,它变得有点复杂;这在这里解释得很好:https://en.wikipedia.org/wiki/UTF-8#Description

  4. wstring 是由 wchar_t 组成的字符串,但遗憾的是 wchar_t 在不同平台上的实现方式不同。例如,在 Visual Studio 上它是 16 位(可用于存储 UTF16),但在 GCC 上它是 32 位(因此可用于直接存储 unicode 代码点)。如果您希望代码可移植,则需要注意这一点。我个人选择只以 UTF8 格式存储字符串,并且只在需要时进行转换。

关于c++ - 字符集如何存储在字符串和 wstrings 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35338109/

相关文章:

c++ - 如何遍历一个boost::multi_array

c++ - 有没有一种方法可以使用 Clang API 扩展宏来获取源代码

c++ - 在 CUDA 内核中使用 char 变量会受到惩罚吗?

c++ - Visual Studio C++ UNICODE 相关故障排除循环

mysql - 让 MySQL 在 SELECT 调用中正确区分日语字符

c++ - char * 的初始化 vector 对我的电脑做了疯狂的事情

c# - 我如何在 C# 中分割数组

java - 字符串数组中的错误 indexOf

ruby - 如何将电子表格 "letternamed"列坐标转换为整数?

javascript - 如何在不匹配特殊字符的情况下匹配 Unicode 特殊字母字符