【问题标题】:UTF8 char to hex value stringUTF8 字符到十六进制值字符串
【发布时间】:2016-01-02 14:38:03
【问题描述】:

我需要一种将字符转换为字符串形式的十六进制值的方法。

我尝试了几种方法,但都忽略了 UTF8 字符。

例如:

取字符:

Ş

如果转换正确,其十六进制值为0x15E,但此代码只返回0x3F,即字符?

wchar_t mychar = 'Ş';
cout << hex << setw(2) << setfill('0') 
                  << static_cast<unsigned int>(mychar);

我找到了一个 javascript 函数,正是我需要的,但无法将其转换为 c++ Here

谢谢

【问题讨论】:

  • mychar的类型是什么?
  • @πάνταῥεῖ 嗯,让我们说“Ş”
  • Ş 什么时候成为类型了??
  • 你用的是什么编译器?你有没有告诉它你对源文件使用什么编码?
  • 这里有几个问题。 wchar_t 不是 UTF-8 - 也许您的意思是 Unicode 而不是 UTF-8?如果您的意思是 UTF-8,为什么要涉及 wchar_t? wchar_t 通常是 UTF-16 或 UTF-32。 'x' 不是一个广泛的文字 - 缺少前缀 L。源文件编码很重要,所以使用 \u 或 \x 使其无关紧要。

标签: c++ utf-8 utf8-decode


【解决方案1】:

问题是您将char 文字分配给wchar_t mychar。因为 char 只有一个字节长,它不能存储字符 Ş。您必须在文字前面加上 L,如下所示:

wchar_t mychar = L'Ş';

一篇关于 Unicode、编码等的非常好的文章是 Joel Spolsky 的 The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

【讨论】:

  • 谢谢! Indeec 一篇很棒的文章。现在明白了,再次感谢。
  • 请注意,mychar 将被编码为 UTF16 或 UTF32,具体取决于编译器和平台。在 UTF8 中,Unicode 代码点 U+015E 是 0xC5 0x9E。有很多方法可以将 wchar_t 转换为 UTF8,无论是在编译时还是在运行时,取决于使用的编译器和库。
【解决方案2】:

即使您在它们前面加上 L,wchar_t 类型也不能很好地处理国际字符集。

试试这个:

char16_t mychar16 {u'Ş'}; // Initialized with UTF-16 code
char32_t mychar32 {U'Ş'}; // Initialized with UTF-32 code

cout << showbase << hex << setw(12) << setfill('0')
     << std::setiosflags(ios::left | ios::hex) 
     << static_cast<unsigned int>(mychar16) << endl;

结果:

0x15e0000000

适用于类型 wchar_t 的字符编码是实现定义的,因此它可能因编译器而异。 char16_t 和 char32_t 类型更适合处理 Unicode 字符。

【讨论】:

    猜你喜欢
    • 2010-10-04
    • 2017-12-02
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 2017-03-04
    • 2019-07-27
    相关资源
    最近更新 更多