如何在C++中将字符串转换为UTF-8

4
我有一个字符串输出,它不一定是有效的 utf8 格式。我必须将其传递给一个只接受有效 utf8 字符串的方法。
因此我需要将输出转换为最接近的有效 utf8 字符串,删除无效字节或部分。如何在 c++ 中实现这个功能?我不想使用第三方库。

2
我认为这不安全。如果您的字符串不是UTF-8,唯一安全的做法就是完全中止操作。否则,您将自己暴露于攻击之下。 - Kerrek SB
1
对于您来说,“无效字节”是什么意思?您想要一个有效的UTF-8流(可能带有无效代码点或不合理的组合),还是一个有效的Unicode UTF-8编码流? - Matthieu M.
1
UTF-8的维基百科页面(http://en.wikipedia.org/wiki/Utf-8)包含了很多信息,应该能够轻松帮助您完成此任务。 - Component 10
@Component 10 - “easily” sounds an overly optimistic.@Component 10 - “容易”听起来过于乐观了。 - SChepurin
1
@SteveJessop:不是的,攻击不在有效字符串中,而是在你试图从无效数据中恢复的方式上。这种情况以前发生过,因此Unicode标准现在规定应用程序在遇到无效字节时应立即放弃。 - Kerrek SB
显示剩余5条评论
2个回答

2
你应该使用icu::UnicodeString方法中的fromUTF8(const StringPiece &utf8)或者toUTF8String(StringClass &result)来处理此问题。

0

如果您确定您的字符串是有效的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数据时,不使用第三方库的要求几乎是不可能的,但UTF8-CPP库仅包含头文件,这是最轻量级的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接