【问题标题】:storing unicode in c++ charcaters在 C++ 字符中存储 unicode
【发布时间】:2018-05-02 16:07:35
【问题描述】:

c++ 中的char 具有1 byte 的内存,但大多数unicode 字符需要2 bytes。 这是否意味着unicode不能存储在charactersc++中?

【问题讨论】:

  • 可以翻译成utf8。 utf8 可以将所有字符存储在字节数组中。
  • 现在阅读this

标签: c++ unicode char


【解决方案1】:

要表示字符,您可以使用通用字符名称 (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 不是那么宽
  • 取决于编译器。如果代码页为 1251,则在 MS VC 上将工作。
  • 它不是由 LOCALE 依赖的编译器依赖的,所以它可以在某些机器上工作,它在其他机器上工作,具体取决于使用哪种编码语言环境。由于其他系统使用的是 UTF-8,因此它无法在那里工作,而在 Windows 上它有时可以工作。
  • @MarekR 同意,取决于使用的编码。但是,在 clang 中缺少编码是一个错误,在 MSVC 中是一个警告。
【解决方案2】:

不,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

【讨论】:

    【解决方案3】:

    C、C++ 还支持用于 unicode utf-16 的 16 位字符类型 wchar_t

    通常通过宏定义WCHARTCHAR

    您可以强制使用 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。
    【解决方案4】:

    首先你必须知道有一种叫做编码的东西。 所以有多种方式来表示非 ASCII 字符。

    当今最流行的编码是 UTF-8,它将单个非 ASCII 字符表示为多个字节 2-4。在这种编码中,您不能将此类字符存储在单个 char 变量中。

    还有其他编码,其中一小部分非 ASCII 字符表示为单字节,例如 ISO 8859-2。编码由语言环境定义,Windows 更喜欢这种编码,这就是为什么Java Rookie 答案有机会为您工作。 其他系统通常对std::string 使用UTF-8,因此单个字符可以用多个字节表示。

    另一种方法是使用wchar_twstringwcoutwcin,注意还有some issues

    【讨论】:

      猜你喜欢
      • 2012-08-14
      • 2012-09-06
      • 2018-12-05
      • 2011-02-11
      • 2018-06-26
      • 2011-07-06
      • 2021-08-22
      • 1970-01-01
      • 2018-12-14
      相关资源
      最近更新 更多