4

大きな UTF-8 文字列を ASCII に変換する必要があります。これは可逆的で、理想的には高速で軽量なアルゴリズムである必要があります。

これどうやってするの?ソースコード (ループを使用) またはJavaScriptコードが必要です。(プラットフォーム/フレームワーク/ライブラリに依存しないでください)

編集: UTF-8オリジナルのエンコードされた形式であるため、ASCII表現は正しく見えず、対応するUTF-8よりも(バイト単位で)大きくなることを理解しています。

4

10 に答える 10

11

Douglas Crockford の json2.js quote 関数の 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 で引用された入力文字列が生成されます。

例:quote("Doppelgänger!")「ドッペルグ\u00e4nger!」

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

var encoded = quote("Doppelgänger!");
var back = JSON.parse(encoded); // eval(encoded);
于 2009-05-07T13:02:21.710 に答える
9

可逆的に ASCII に変換できる UTF-8 文字列はすべて、すでに ASCII です。

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

于 2009-05-07T12:20:53.073 に答える
5

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

UTF-8 text/plain を ASCII someother/format に変換できます。たとえば、HTML では、文字参照を使用して、UTF-8 の任意の文字を ASCII データ ファイルで表すことができます。

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

URLによって別のアプローチが採用され、 encodeURIComponentとして JS に実装されます。

于 2009-05-07T12:31:42.267 に答える
3

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

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

ただし、 UTF-7などの ASCII 互換エンコーディングで Unicode データを (ソース エンコーディングに関係なく) エンコードしようとすることはできます。これは、生成されたデータが合法的に ASCII として解釈される可能性があることを意味しますが、実際には UTF-7 です。

于 2009-05-07T13:11:07.460 に答える
2

文字列が 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);
于 2009-05-07T12:43:26.887 に答える
1

UTF-8文字列をASCIIに変換することはできませんが、UnicodeをASCII互換の文字列としてエンコードすることはできます。

おそらくPunycodeを使用したいと思うでしょう-これはすでにすべてのUnicode文字をASCIIにエンコードする標準のUnicodeエンコーディングです。JavaScriptコードについては、この質問を確認してください

他の人が反対票を投じないように、質問のタイトルと説明を編集してください。用語変換は使用せず、エンコーディングを使用してください。

于 2009-12-23T13:38:40.903 に答える
0

これは、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;
}
于 2015-04-23T13:35:32.430 に答える
0

ASCII 以外のすべての文字を取り除きますか (スラッシュを '?' に置き換えます)、または Unicode コード ポイントを非 Unicode システムに格納しますか?

最初に、128 を超える値をチェックして置換するループで実行できます。

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

于 2009-05-07T13:14:27.220 に答える
0
function utf8ToAscii(str) {
    /**
     * ASCII contains 127 characters.
     * 
     * In JavaScript, strings is encoded by UTF-16, it means that
     * js cannot present strings which charCode greater than 2^16. Eg:
     * `String.fromCharCode(0) === String.fromCharCode(2**16)`
     *
     * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMString/Binary
     */
    const reg = /[\x7f-\uffff]/g; // charCode: [127, 65535]
    const replacer = (s) => {
        const charCode = s.charCodeAt(0);
        const unicode = charCode.toString(16).padStart(4, '0');
        return `\\u${unicode}`;
    };

    return str.replace(reg, replacer);
}

より良い方法

Uint8Array to string in Javascriptも参照してください。あなたは使用することができTextEncoderますUint8Array

function utf8ToAscii(str) {
    const enc = new TextEncoder('utf-8');
    const u8s = enc.encode(str);

    return Array.from(u8s).map(v => String.fromCharCode(v)).join('');
}
// For ascii to string
// new TextDecoder().decode(new Uint8Array(str.split('').map(v=>v.charCodeAt(0))))
于 2022-01-17T21:55:45.340 に答える
-1

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

eval()エンコードを逆にするために使用できます。

var foo = 'Hägar';
var quotedFoo = quote(foo);
var unquotedFoo = eval(quotedFoo);
alert(foo === unquotedFoo);
于 2009-05-07T13:10:14.187 に答える