【问题标题】:How convert to utf8 string in c++如何在 C++ 中转换为 utf8 字符串
【发布时间】:2012-10-13 09:38:10
【问题描述】:

我有一个字符串输出,它不一定是有效的 utf8。我必须将它传递给只接受有效 utf8 字符串的方法。
因此,我需要将输出转换为最接近的有效 utf8 字符串,删除无效字节或部分。我怎么能在 C++ 中做到这一点?我不想使用 3rd 方库。

【问题讨论】:

  • 我认为这不安全。如果您的字符串不是 UTF-8,唯一安全的做法是完全中止。否则,您将面临攻击。
  • invalid bytes 对您意味着什么?你想要一个有效的 utf-8 流(可能包含无效的代码点或无意义的组​​合)还是一个有效的 unicode utf-8 编码流?
  • 我需要一个有效的 unicode utf-8 编码流...删除所有无效的内容。
  • UTF-8 的 Wikipedia 页面 (en.wikipedia.org/wiki/Utf-8) 包含大量信息,可以轻松帮助您完成此任务。
  • @SteveJessop:不不,攻击不在 valid 字符串中,而是在您尝试从 invalid 数据中恢复的方式中。这种情况以前发生过,因此,Unicode 标准现在规定应用程序应在遇到无效字节时立即放弃。

标签: c++ string utf-8


【解决方案1】:

您应该使用icu::UnicodeString 方法fromUTF8(const StringPiece &utf8)toUTF8String(StringClass &result).

【讨论】:

    【解决方案2】:

    如果您确定您的字符串是有效的 UTF-8,只有几个损坏的字节,http://utfcpp.sourceforge.net/ 可以解决这个问题。从页面:

    #include "utf8.h"
    void fix_utf8_string(std::string& str) {
        std::string temp;
        utf8::replace_invalid(str.begin(), str.end(), back_inserter(temp));
        str = temp;
    }

    在处理 Unicode 数据时,您几乎不可能要求不使用 3rd 方库,但 UTF8-CPP 库是仅标头,这是您可以得到的最轻量级的。

    【讨论】:

      猜你喜欢
      • 2011-01-21
      • 1970-01-01
      • 2012-10-03
      • 2020-10-11
      • 2012-02-01
      • 2013-06-06
      • 2018-12-08
      • 2016-09-04
      • 2012-07-17
      相关资源
      最近更新 更多