4

少なくともヨーロッパ言語の最も一般的な文字を変換できるコード スニペットを持っている人はいますか? 例えば:

テスターン

UTF-8 でエンコードされた文字列として (つまり、16 進数のバイト: 74 65 73 74 c3 a1 c3 a9 6e 0)

テスト

(c/c++ と std、または小さなクロスプラットフォーム ライブラリを使用したい)

4

3 に答える 3

5

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");
}
于 2012-05-20T18:43:36.670 に答える
4

処理する必要のあるUnicode文字の膨大なコレクションがあります。したがって、「小さい」という基準は不可能な基準です。ICUライブラリには必要なものが含まれていますが、このため、小さいとは言えません。たとえば、合成修飾子と非合成修飾子の両方を処理する必要があります。

可能なUnicode文字の小さなサブセットだけを本当に気にする場合は、独自の単純なマッピングテーブルを作成できます。

于 2012-05-20T12:12:05.990 に答える
3

c/c++ と std、または小さなクロスプラットフォーム ライブラリを使用したい

残念ながら、あなたの基準をすべて満たすライブラリが存在するかどうかはわかりません。

あなたが見つける可能性のある最小のものはiconvであり、その UTF-8 から ASCII へのコンバーターは、あなたが望むものを正確に実行しない可能性があります。

ICUはあなたのやりたいことができると確信しています。ICU はクロスプラットフォームですが、小さいと非難されたことはありません。

于 2012-05-20T11:46:11.737 に答える