【发布时间】:2018-05-02 16:07:35
【问题描述】:
c++ 中的char 具有1 byte 的内存,但大多数unicode 字符需要2 bytes。
这是否意味着unicode不能存储在characters中c++中?
【问题讨论】:
-
可以翻译成utf8。 utf8 可以将所有字符存储在字节数组中。
-
现在阅读this。
c++ 中的char 具有1 byte 的内存,但大多数unicode 字符需要2 bytes。
这是否意味着unicode不能存储在characters中c++中?
【问题讨论】:
要表示字符,您可以使用通用字符名称 (UCN)。字符'ф' 的Unicode 值是U+0444,所以在C++ 中你可以写成'\u0444' 或'\U00000444'。此外,如果源代码编码支持此字符,那么您可以直接在源代码中编写它。
// both of these assume that the character can be represented with
// a single char in the execution encoding
char b = '\u0444';
char a = 'ф'; // this line additionally assumes that the source character
// encoding supports this character
打印这些字符取决于您要打印的内容。如果要打印到 Unix 终端仿真器,终端仿真器正在使用支持该字符的编码,并且该编码与编译器的执行编码相匹配,那么您可以执行以下操作:
#include <iostream>
int main() {
std::cout << "Hello, ф or \u0444!\n";
}
你也可以使用wchar_t
【讨论】:
char b = '\u0444'; 在大多数实现中都不起作用,因为char 不是那么宽
不,char 不是唯一的。如果您在 Windows 上,则有 wchar_t (WCHAR) 或通常认为 short 也是 2 字节,但更多的是您想要实现和使用它的方式,例如协议:
#if !defined(_NATIVE_WCHAR_T_DEFINED)
typedef unsigned short WCHAR;
#else
typedef wchar_t WCHAR;
#endif
WCHAR* strDemo = L"consider the L";
但您需要在网络上挖掘更多信息。它们也被称为多字节字符串,因此请在您的搜索中考虑这一点。
例如:
就像更一般的老式跨平台 BSD 方式:
https://www.freebsd.org/cgi/man.cgi?query=multibyte&apropos=0&sektion=0&format=html
http://utf8everywhere.org。不要错过这个
另外,既然你首先提出了这个问题,我认为你也应该知道 boost。
【讨论】:
C、C++ 还支持用于 unicode utf-16 的 16 位字符类型 wchar_t。
通常通过宏定义WCHAR 或TCHAR。
您可以强制使用 16 位字符文字/源代码常量:
wchar_t c = L'a';
和 16 位字符串一样:
wchar_t[256] s = L"utf-16";
【讨论】:
wchar_t 不是 16 位类型,不一定用于 UTF-16。 TCHAR 也不是标准宏
wchar_t通常是16位类型,在Windows以外的平台上通常不是16位类型。 OP 没有询问 Windows
wchar_t 在 Windows 上是 2 个字节,用于 UTF-16。在大多数其他平台上,wchar_t 是 4 个字节,用于 UTF-32。
首先你必须知道有一种叫做编码的东西。 所以有多种方式来表示非 ASCII 字符。
当今最流行的编码是 UTF-8,它将单个非 ASCII 字符表示为多个字节 2-4。在这种编码中,您不能将此类字符存储在单个 char 变量中。
还有其他编码,其中一小部分非 ASCII 字符表示为单字节,例如 ISO 8859-2。编码由语言环境定义,Windows 更喜欢这种编码,这就是为什么Java Rookie 答案有机会为您工作。
其他系统通常对std::string 使用UTF-8,因此单个字符可以用多个字节表示。
另一种方法是使用wchar_twstringwcoutwcin,注意还有some issues。
【讨论】: