質問

大きなUTF-8文字列をASCIIに変換する必要があります。リバーシブルであり、理想的には高速/軽量のアルゴリズムでなければなりません。

これを行うにはどうすればよいですか? ソースコード(ループを使用)または JavaScript コードが必要です。 (プラットフォーム/フレームワーク/ライブラリに依存してはいけません)

編集: ASCII表現は正しく表示されず、UTF-8のエンコードされた形式であるため、UTF-8の同等物よりも(バイト数で)大きくなることを理解しています。

役に立ちましたか?

解決

Douglas Crockfordのjson2.js引用関数のASCIIのみのバージョンを使用できます。これは次のようになります。

    var escapable = /[\\\"\x00-\x1f\x7f-\uffff]/g,
        meta = {    // table of character substitutions
            '\b': '\\b',
            '\t': '\\t',
            '\n': '\\n',
            '\f': '\\f',
            '\r': '\\r',
            '"' : '\\"',
            '\\': '\\\\'
        };

    function quote(string) {

// If the string contains no control characters, no quote characters, and no
// backslash characters, then we can safely slap some quotes around it.
// Otherwise we must also replace the offending characters with safe escape
// sequences.

        escapable.lastIndex = 0;
        return escapable.test(string) ?
            '"' + string.replace(escapable, function (a) {
                var c = meta[a];
                return typeof c === 'string' ? c :
                    '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
            }) + '"' :
            '"' + string + '"';
    }

これにより、入力文字列の有効なASCIIのみのjavascript引用符が生成されます

e.g。 quote(" Doppelgä nger!")は" Doppelg \ u00e4nger!"になります

エンコードを元に戻すには、結果を評価するだけです

var encoded = quote("Doppelgänger!");
var back = JSON.parse(encoded); // eval(encoded);

他のヒント

ASCIIに可逆的に変換可能なUTF-8文字列は、すでにASCIIです。

UTF-8は任意のUnicode文字を表すことができます-ASCIIはできません。

他の人が言ったように、データを落とさずにUTF-8テキスト/プレーンをASCIIテキスト/プレーンに変換することはできません。

UTF-8のtext / plainを他のASCII /フォーマットに変換できます。たとえば、HTMLでは、文字参照

この例を続けると、JavaScriptで charCodeAt HTML文字参照を使用して、文字列を表現に変換するのに役立ちます。

別のアプローチは、 URL によって行われ、JSでは encodeURIComponent

あなたの要件はかなり奇妙です。

UTF-8をASCIIに変換すると、Unicodeコードポイントに関するすべての情報が失われます> 127(つまり、ASCII以外のすべて)。

ただし、 UTF-7 。これは、生成されるデータが合法的にASCIIとして解釈される可能性があることを意味しますが、実際にはUTF-7です。

文字列がUTF-8としてエンコードされている場合、文字列ではなくなります。バイナリデータです。バイナリデータをASCIIとして表現する場合は、制限されたASCII文字セットを使用して表現できる文字列にフォーマットする必要があります。

1つの方法は、base-64エンコーディングを使用することです(C#の例):

string original = "asdf";
// encode the string into UTF-8 data:
byte[] encodedUtf8 = Encoding.UTF8.GetBytes(original);
// format the data into base-64:
string base64 = Convert.ToBase64String(encodedUtf8);

ASCIIデータとしてエンコードされた文字列が必要な場合:

// encode the base-64 string into ASCII data:
byte[] encodedAscii = Encoding.ASCII.GetBytes(base64);

すべての非ASCII文字を削除(スラッシュを「?」などに置き換えます)するか、Unicodeコードポイントを非Unicodeシステムに保存しますか?

最初に、値のループチェックで行うことができます> 128およびそれらを交換します。

"任意のプラットフォーム/フレームワーク/ライブラリ"を使用したくない場合その後、独自のエンコーダを作成する必要があります。それ以外の場合は、JQueryの.html();

を使用します

UTF-8文字列をASCIIに変換することは不可能ですが、ASCII互換文字列としてUnicodeをエンコードすることは可能です。

おそらく Punycode を使用したい-これはすでにすべてをエンコードする標準のUnicodeエンコードですUnicode文字をASCIIに変換します。 JavaScriptコードについては、この質問

質問のタイトルと説明を編集して、他の人がそれを投票しないようにしてください-用語変換を使用せず、エンコードを使用してください。

これは、UTF8アクセントをASCIIアクセントに変換する関数です(àéèîなど) 文字列にアクセントがある場合、例として%239に変換されます 次に、反対側で、文字列を解析し、アクセントがあるときとASCII文字が何であるかを知っています。

JavaScriptで使用して、ASCIIで動作するマイクロコントローラーにデータを送信しました。

convertUtf8ToAscii = function (str) {
    var asciiStr = "";
    var refTable = { // Reference table Unicode vs ASCII
        199: 128, 252: 129, 233: 130, 226: 131, 228: 132, 224: 133, 231: 135, 234: 136, 235: 137, 232: 138,
        239: 139, 238: 140, 236: 141, 196: 142, 201: 144, 244: 147, 246: 148, 242: 149, 251: 150, 249: 151
    };
    for(var i = 0; i < str.length; i++){
        var ascii = refTable[str.charCodeAt(i)];
        if (ascii != undefined)
            asciiStr += "%" +ascii;
        else
            asciiStr += str[i];
    }
    return asciiStr;
}

quote()関数の実装は、あなたが望むことをするかもしれません。 私のバージョンここにあります

eval()を使用して、エンコードを逆にすることができます:

var foo = 'Hägar';
var quotedFoo = quote(foo);
var unquotedFoo = eval(quotedFoo);
alert(foo === unquotedFoo);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top