1

NSXMLParserアプリへの XML の解析に使用していて、エンコーディング タイプに問題があります。たとえば、これは入ってくるフィードの 1 つです。これに似ています。"

\U2026Some random text from the xml feed\U2026

私は現在、エンコーディングタイプを使用しています:

NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];

\U2026 を楕円 (...) に変換するには、どのエンコーディング タイプを使用すると思いますか??

4

3 に答える 3

1

了解しました。ユニコードコードポイントで機能するコードのスニペットを次に示します。

NSString *stringByUnescapingUnicodeSymbols(NSString *input)
{
    NSMutableString *output = [NSMutableString stringWithCapacity:[input length]];

    // get the UTF8 string for this string...
    const char *UTF8Str = [input UTF8String];

    while (*UTF8Str) {
        if (*UTF8Str == '\\' && tolower(*(UTF8Str + 1)) == 'u')
        {
            // skip the next 2 chars '\' and 'u'
            UTF8Str += 2;

            // make sure we only read 4 chars
            char tmp[5] = { UTF8Str[0], UTF8Str[1], UTF8Str[2], UTF8Str[3], 0 };
            long unicode = strtol(tmp, NULL, 16); // remember that Unicode is base 16

            [output appendFormat:@"%C", unicode];

            // move on with the string (making sure we dont miss the end of the string
            for (int i = 0; i < 4; i++) {
                if (*UTF8Str == 0)
                    break;
                UTF8Str++;
            }
        }
        else 
        {
            if (*UTF8Str == 0)
                break;

            [output appendFormat:@"%c", *UTF8Str];
        }


        UTF8Str++;
    }

    return output;
}
于 2012-06-13T21:51:23.840 に答える
1

ここでの答えは、あなたがめちゃくちゃだということです。彼らは XML に非標準のエンコーディングを使用していますが、本当にリテラルが必要な場合はどうすればよい\U2026でしょうか? すべて\UXXXX\uXXXXエンコーディングを処理するデコーダを追加するとします。別のフィードがデータをリテラルにしたい場合はどうなり\U2026ますか?

あなたが第一選択であり、最善の策はこのフィードを修正することです。データをエンコードする必要がある場合は、適切な HTML エンティティまたは数値参照を使用する必要があります。

フォールバックとして、デコーダーを XML パーサーから切り離します。非準拠のデータを取得するという理由だけで、非準拠の XML パーサーを作成しないでください。問題のあるフィードでのみ実行されるポスト プロセッサを用意します。


デコーダーが必要な場合は、さらに悪いニュースがあります。組み込みのデコーダーはありません。オンラインでカテゴリを見つけるか、自分で作成する必要があります。


いくつか突っ込んだ後、私はObjective C/Cocoa を使用して Unicode 文字をエスケープ解除すると思います。つまり、\u1234がうまくいくかもしれません。

于 2012-06-13T21:49:15.153 に答える
0

引用符のリテラル'\U2026'を単純に置き換えてから、NSUTF8StringEncodingでNSDataにエンコードする必要があります。

于 2012-06-13T21:28:52.203 に答える