Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用c+将UTF-8字符转换为最接近的等效ASCII字符+;(不含winapi)_C++_Utf 8_Ascii - Fatal编程技术网

C++ 使用c+将UTF-8字符转换为最接近的等效ASCII字符+;(不含winapi)

C++ 使用c+将UTF-8字符转换为最接近的等效ASCII字符+;(不含winapi),c++,utf-8,ascii,C++,Utf 8,Ascii,有没有人有一个代码片段,它至少可以转换欧洲语言中最常见的字符? 例如: 测试 作为UTF-8编码字符串(即十六进制字节:74 65 73 74 c3 a1 c3 a9 6e 0) 到 测试者 (我想使用c/c++和std,或小型跨平台库) 我想使用c/c++和std,或小型跨平台库 不幸的是,我不确定是否存在满足所有条件的库 您可能会发现,它的UTF-8-to-ASCII转换器可能无法完全满足您的需求 我很确定它可以做你想做的事情,虽然ICU是跨平台的,但从来没有人指责它太小。你需要处理大量的U

有没有人有一个代码片段,它至少可以转换欧洲语言中最常见的字符? 例如:

测试

作为UTF-8编码字符串(即十六进制字节:74 65 73 74 c3 a1 c3 a9 6e 0)

测试者

(我想使用c/c++和std,或小型跨平台库)

我想使用c/c++和std,或小型跨平台库

不幸的是,我不确定是否存在满足所有条件的库

您可能会发现,它的UTF-8-to-ASCII转换器可能无法完全满足您的需求


我很确定它可以做你想做的事情,虽然ICU是跨平台的,但从来没有人指责它太小。

你需要处理大量的Unicode字符。因此,“小”的标准是不可能的标准。ICU图书馆包含您需要的内容,但出于这个原因,您不会发现它很小。例如,您将需要处理组合和非组合修饰符


如果您真的只关心可能的Unicode字符的一小部分,那么您可以创建自己的简单映射表。

以下是处理将字符从ISO-8859-1范围转换为ascii的代码。替换字符用于ascii以外的所有其他字符

#include <codecvt>
#include <array>
#include <string>

#include <iostream>

constexpr char const *rc = "?"; // replacement_char

// table mapping ISO-8859-1 characters to similar ASCII characters
std::array<char const *,96> conversions = {{
   " ",  "!","c","L", rc,"Y", "|","S", rc,"C","a","<<",   rc,  "-",  "R", "-",
    rc,"+/-","2","3","'","u", "P",".",",","1","o",">>","1/4","1/2","3/4", "?", 
   "A",  "A","A","A","A","A","AE","C","E","E","E", "E",  "I",  "I",  "I", "I",
   "D",  "N","O","O","O","O", "O","*","0","U","U", "U",  "U",  "Y",  "P","ss",
   "a",  "a","a","a","a","a","ae","c","e","e","e", "e",  "i",  "i",  "i", "i",
   "d",  "n","o","o","o","o", "o","/","0","u","u", "u",  "u",  "y",  "p", "y"    
}};

template <class Facet>
class usable_facet : public Facet {
public:
    using Facet::Facet;
    ~usable_facet() {}
};

std::string to_ascii(std::string const &utf8) {
    std::wstring_convert<usable_facet<std::codecvt<char32_t,char,std::mbstate_t>>,
                         char32_t> convert;
    std::u32string utf32 = convert.from_bytes(utf8);

    std::string ascii;
    for (char32_t c : utf32) {
        if (c<=U'\u007F')
            ascii.push_back(static_cast<char>(c));
        else if (U'\u00A0'<=c && c<=U'\u00FF')
            ascii.append(conversions[c - U'\u00A0']);
        else
            ascii.append(rc);
    }
    return ascii;
}

int main() {
    std::cout << to_ascii(u8"testáén\n");
}
#包括
#包括
#包括
#包括
constexpr char const*rc=“?”;//替换字符
//将ISO-8859-1字符映射为类似ASCII字符的表
std::数组转换={{

“,”、“!”、“c”、“L”、“rc”、“Y”、“S”、“rc”、“c”、“a”,“我知道
Ã
映射到
a
,但是为什么
映射到
e
?第二个
Ã
发生了什么?你试过写这样的代码吗?嘿!我用过这个工具:Ãconverts toá,我需要一个©converts toé,我想要eDid你的意思是写“testán”应该映射到“testen”而不是“测试”?我认为您可能粘贴了一些丢失了正确编码的内容。您可以编译ICU的小版本,其中只包含您想要的最小数据集。不过,它非常灵活。您可以使用ICU生成utf-8=>ascii转换序列的静态trie。它应该非常小,非常快,而且肯定是跨平台的。注意t在C++17中不推荐使用hat std::wstring_convert。另外,请注意,在visual studio中,您需要使用uint32_t而不是char32_t