5

SQLiteのデータベースにデータを保存するために、ISOLatin1形式のテキストを処理するC++のソフトウェアを変更しています。
問題は、SQLiteがUTF-8で動作し、同じデータベースを使用するJavaモジュールがUTF-8で動作することです。

データベースに保存する前に、ISOLatin1文字をUTF-8文字に変換する方法が必要でした。WindowsとMacで動作するために必要です。

ICUがそうするだろうと聞きましたが、肥大化しすぎていると思います。これらの2つの文字セットには、単純な変換システム(できれば前後)が必要です。

どうすればいいですか?

4

4 に答える 4

17

ISO-8859-1は、ISO /IEC10646およびUnicodeの最初の256コードポイントとして組み込まれました。したがって、変換は非常に簡単です。

各文字について:

uint8_t ch = code_point; /* assume that code points above 0xff are impossible since latin-1 is 8-bit */

if(ch < 0x80) {
    append(ch);
} else {
    append(0xc0 | (ch & 0xc0) >> 6); /* first byte, simplified since our range is only 8-bits */
    append(0x80 | (ch & 0x3f));
}

詳細については、 http://en.wikipedia.org/wiki/UTF-8#Descriptionを参照してください。

編集:ninjaljのコメントによると、latin-1はdirecltyを最初の256個のユニコードコードポイントに変換するため、上記のアルゴリズムが機能するはずです。

于 2011-04-07T19:43:34.060 に答える
2

C ++に私はこれを使用します:

std::string iso_8859_1_to_utf8(std::string &str)
{
    string strOut;
    for (std::string::iterator it = str.begin(); it != str.end(); ++it)
    {
        uint8_t ch = *it;
        if (ch < 0x80) {
            strOut.push_back(ch);
        }
        else {
            strOut.push_back(0xc0 | ch >> 6);
            strOut.push_back(0x80 | (ch & 0x3f));
        }
    }
    return strOut;
}
于 2016-10-05T21:19:03.863 に答える
1

汎用の文字セットフレームワーク(iconvなど)が肥大化しすぎている場合は、独自のフレームワークを使用してください。

静的変換テーブル(charからUTF-8シーケンス)を作成し、独自の変換をまとめます。文字列ストレージに何を使用するか(charバッファ、std :: stringなど)によって、外観は多少異なりますが、アイデアは、ソース文字列をスクロールし、各文字を127を超えるコードでUTF-8に置き換えることです。対応する文字列。これにより文字列の長さが長くなる可能性があるため、適切な場所で行うのはかなり不便です。追加の利点として、2つのパスでそれを行うことができます。パス1は必要なターゲット文字列サイズを決定し、パス2は変換を実行します。

于 2011-04-07T19:16:44.080 に答える
0

追加のコピーを実行してもかまわない場合は、ISO Latin 1文字を16ビット文字に「拡張」して、UTF-16を取得できます。次に、UTF8-CPPなどを使用してUTF-8に変換できます。

実際、UTF8-CPPはISO Latin 1をUTF-8に直接変換することもできると思います(utf16to8関数)が、警告が表示される場合があります。

もちろん、Windows CP 1232ではなく、実際のISOLatin1である必要があります。

于 2011-04-07T19:31:47.860 に答える