c++ - 在没有 ICU 或 boost 的情况下规范化 C++ 中的 unicode 字符?

标签 c++ unicode

我正在尝试将包含重音符号的字符串转换为 C++ 中的纯 ASCII 字符串(出于索引目的)。我知道这个问题已被问过无数次,但与其他人不同的是,我无法选择包含任何第 3 方库,如 ICU,甚至无法使用 boost。

到目前为止,我已经尝试创建重音符号到规范化字符(unsigned char 到 unsigned char)的映射,如下所示

map<unsigned char, unsigned char> myMap;
myMap['ì'] = 'i'; //few more like this

然后是这个函数

string result;
for(size_t i = 0; i < inputString.size(); i++) {
    if(myMap.count(inputString[i]) > 0) {
        result += myMap[inputString[i]];
    } else {
        result += inputString[i];
    }
}

但是当我尝试使用像“Forlì”这样的字符串时,它返回给我 Forl<C3>i .为什么会这样?我怎样才能删除这个额外的 <C3>

请注意,这将是生产级别的代码,因此我将避免为这样一个微小的变化包含大量类(只是由 unsigned char 表示的重音字符大小写)。

最佳答案

也许您应该使用 unsigned short 作为 map 的第一种类型。同时将源文件保存为UTF16。

啊..对于 basic_string,我认为这段代码无论如何都行不通。

原始文本必须使用 UTF8 或 UTF16 编码。看成ASCII会介绍C/C++标准库字符集转换。我怀疑C3发生在这一步。这种编码处理可能会使情况恶化。

Unicode 实际上只是 65535 个 16 位值。如果我们只针对字母之类的字符,正确的代码转换是非常可行的,恕我直言。但是如果我们将它加载为 ASCII,我们必须知道 C/C++ IO 如何处理代码转换。

兼容性、便携性……非常复杂。这是许多人像图书馆一样使用 ICU 的原因之一。

关于c++ - 在没有 ICU 或 boost 的情况下规范化 C++ 中的 unicode 字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28824986/

相关文章:

c++ - 如何根据常量和返回类型调用重载函数?

c++ - 通过重载进行部分模板特化

java - 使用 unicode 显示欧元符号并将字符更改为大写

java - 从 System.in 流中读取和写入 UTF-8 字符

c++ - 如何构建应用程序框架

c++ - 使用 lambdas 移动

c++ - 将模拟对象分配给 protected 成员

javascript - 在图标选择器中使用 Unicode 图标

python - 如何在 Django Admin 中为属于方法//属性的字段重命名列标签?

Java Unicode 到可读文本的转换解码