【问题标题】:converting array of bytes to UTF-8 unicode将字节数组转换为 UTF-8 unicode
【发布时间】:2011-06-05 20:03:49
【问题描述】:

我有一个保存为 UTF-8 的文件,我正在这样读取它:

ReadFile(hFile, pContents, pFile->nFileSize, &dwRead, NULL);

(pContents 是一个大小为 nFileSize 的 BYTE*)

它只是一个 100 字节左右的小文件,包含我想以 wchar_t* 格式读入内存的文本,因此我可以使用 unicode 文本设置编辑和静态控件的文本。

如何将字节转换为 UTF-8?

编辑(我不想使用 fstream 或 wfstream)

【问题讨论】:

  • 字节已经是UTF-8,如果你正在阅读UTF-8编码的文本。 C++ 和 C 都不关心编码,它们只看到一个字节数组。你到底想做什么?
  • 我认为 utf-8 是多字节的,就像它有时需要 2 个字节来完成一个字符,我只是将它读入一个字节数组
  • 对。因此,数组中的 2、3 或 4 个字节可以共同确定一个字符。这是 UTF-8。您不能将其“转换”为 UTF-8,因为它已经是 UTF-8。您可以将其转换为 UTF-32 以处理字符,但这在实践中很少有用,除非您正在执行高级文本处理。将其保留为 UTF-8,除非您知道不起作用的原因。
  • 有多种 Unicode 编码。 UTF-8 每个代码点使用从 8 位到 32 位的任何内容,UTF-16 每个代码点使用一个或两个 16 位“代码单元”,而 UTF-32 对每个代码点使用 32 位。您可以确定不会遇到“未完成”字符的唯一方法是将数据转换为 UTF-32 并使用 4 个字节存储每个字符。
  • 您只需要 Unicode 代码点来查找字符属性,例如大小写。如果您有一个程序在按原样传递非 ASCII 字节的同时对 ASCII 字符执行操作(例如,编写一个 CSV 解析器,其中只有 ,"\n 具有语法意义),那么您可以只需将您的字符串保留为 UTF-8。 ASCII 兼容性是最初发明 UTF-8 的原因。

标签: c++ c winapi unicode utf-8


【解决方案1】:

【讨论】:

    【解决方案2】:

    如果文件是 UTF-8 格式并且您将其读入数组。
    然后它仍然是 UTF-8 格式,你不需要做任何事情。

    【讨论】:

    • 虽然这在这个词的技术意义上是正确的并且不值得被否决,但它仍然是一个开玩笑的回答。是的,这些字节仍然代表一个 UTF-8 字符串,但它们不能被这样操作。你甚至不能问“我有多少个字符?”这个问题。更不用说要求它“删除最后一个字符”。
    • @Volodya:这并不意味着开玩笑,而是提供的唯一正确答案。其他两个答案不正确。当他们将 UTF-8 数组转换为 UTF-16 数组时(OP 专门请求了一个 UTF-8 数组(请参阅问题)。
    • 您在评论中指出了与此问题无关的可变宽度字符格式的一个典型弱点。就像上面的转换函数一样,有等效的函数来查找 MBC 字符串的字符串长度。您还会注意到,您无法直接找到 UTF-16 的字符串长度(因为它也是一种多字节字符格式(您需要知道 surrogate pairs 的位置并以不同的方式计算它们)。
    【解决方案3】:
    int res2 = WideCharToMultiByte(CP_UTF8, 0, tempBuf.c_str(), -1, 
                                   multiByteBuf, lengthOfInputString, NULL, NULL);
    int res = MultiByteToWideChar(CP_UTF8, 0, buf, -1, wcharBuf, lengthOfInputString);
    

    【讨论】:

      猜你喜欢
      • 2015-10-08
      • 2012-06-20
      • 2020-06-07
      • 2015-07-20
      • 2010-12-24
      • 2018-04-01
      • 2013-01-25
      • 1970-01-01
      相关资源
      最近更新 更多