1

xmlTextWriterfromを使用して、libxml2いくつかの xml ファイルを作成しています。そして、キリル文字をそれらに書き込む必要があります。私はこのようにします:

xmlTextWriterStartDocument(writer, NULL, "utf-8", NULL);
...
snprintf(buf, sizeof(buf), "%s", "тест");
xmlTextWriterWriteAttribute(writer, 
                            (const xmlChar*)"test_attribute", 
                            (const xmlChar*)buf);

しかし、結果の xml ファイルを開くと、次のように、テキストの html 表現が表示されます。test_attribute="тест"

どうすればこれを修正できますか?

4

1 に答える 1

2

別の utf-8 エンコーダーを使用する必要があります。

snprintf() では、テキストは UTF-8 (可変幅エンコーディング) ではなく、CP-1251 (シングルバイト ASCII 時代のエンコーディング) です。

リファレンス実装については、次のリンクを参照してください: http://7maze.ru/node/29

コメントはロシア語ですが、必要なのは変換表と

string convertToUtf8(const char* chars, int len)

最後に関数。

使用した "тест" 文字列は、エンコード中に "РўРчС_С'" (絶対に無意味) のようになります。

1 つの古いプロジェクトからの古い C コード。CP-866 エンコーディング (MS-DOS のもう 1 つの「一般的な」エンコーディング) を使用しますが、CP-1251 からの変換は簡単です。

/// CP866 to UTF-8
char *dosstrtou(char *buffer,const char *dosstr)
{
    char *buf1=buffer;
    while (*dosstr)
    {
        if ( (*dosstr>127)&&(*dosstr<176) )
        {
            *buf1=208;
            buf1++;
            *buf1 = (char)(*dosstr+16);
            dosstr++;
            buf1++;
            continue;
        }       
        if ( (*dosstr>223)&&(*dosstr<240) )
        {
            *buf1=209;
            buf1++;
            *buf1 = (char)(*dosstr-96);
            dosstr++;
            buf1++;
            continue;
        }       
        if (*dosstr==240)
        {
            *buf1=208;
            buf1++;
            *buf1=129;
            dosstr++;
            buf1++;
            continue;
        }       
        if (*dosstr==241)
        {
            *buf1=209;
            buf1++;
            *buf1=145;
            dosstr++;
            buf1++;
        }
        *buf1=*dosstr;
        buf1++;
        dosstr++;
    }
    *buf1='\0';
    return (buffer);
}

/// CP1251 to CP866
char *winstrtodos(char *buffer){
    char *ptr=buffer;
    while (*ptr!='\0')
    {
        if ( (*ptr>=0x80+0x40)&&(*ptr<=0xAF+0x40) )
            *ptr =(char)(*ptr-0x40);
        if ( (*ptr>=0xE0+0x10)&&(*ptr<=0xEF+0x10) )
            *ptr = (char)(*ptr-0x10);
        if (*ptr==0xA8) *ptr=0xF0;  
        if (*ptr==0xB8) *ptr=0xF1;
        ptr++;
    }
    return (buffer);
}

ただ記憶には気をつけてください。

于 2012-07-12T17:54:55.780 に答える