大きな UTF-8 文字列を ASCII に変換する必要があります。これは可逆的で、理想的には高速で軽量なアルゴリズムである必要があります。
これどうやってするの?ソースコード (ループを使用) またはJavaScriptコードが必要です。(プラットフォーム/フレームワーク/ライブラリに依存しないでください)
編集: UTF-8オリジナルのエンコードされた形式であるため、ASCII表現は正しく見えず、対応するUTF-8よりも(バイト単位で)大きくなることを理解しています。
大きな UTF-8 文字列を ASCII に変換する必要があります。これは可逆的で、理想的には高速で軽量なアルゴリズムである必要があります。
これどうやってするの?ソースコード (ループを使用) またはJavaScriptコードが必要です。(プラットフォーム/フレームワーク/ライブラリに依存しないでください)
編集: UTF-8オリジナルのエンコードされた形式であるため、ASCII表現は正しく見えず、対応するUTF-8よりも(バイト単位で)大きくなることを理解しています。
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);
可逆的に ASCII に変換できる UTF-8 文字列はすべて、すでに ASCII です。
UTF-8 は任意の Unicode 文字を表現できますが、ASCII は表現できません。
他の人が言ったように、データを削除せずに UTF-8 テキスト/プレーンを ASCII テキスト/プレーンに変換することはできません。
UTF-8 text/plain を ASCII someother/format に変換できます。たとえば、HTML では、文字参照を使用して、UTF-8 の任意の文字を ASCII データ ファイルで表すことができます。
この例を JavaScript で続けると、charCodeAtは、HTML 文字参照を使用して文字列をその表現に変換するのに役立ちます。
URLによって別のアプローチが採用され、 encodeURIComponentとして JS に実装されます。
あなたの要件はかなり奇妙です。
UTF-8 を ASCII に変換すると、127 を超える Unicode コードポイントに関するすべての情報 (つまり、ASCII 以外のすべて) が失われます。
ただし、 UTF-7などの ASCII 互換エンコーディングで Unicode データを (ソース エンコーディングに関係なく) エンコードしようとすることはできます。これは、生成されたデータが合法的に 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);
UTF-8文字列をASCIIに変換することはできませんが、UnicodeをASCII互換の文字列としてエンコードすることはできます。
おそらくPunycodeを使用したいと思うでしょう-これはすでにすべてのUnicode文字をASCIIにエンコードする標準のUnicodeエンコーディングです。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;
}
ASCII 以外のすべての文字を取り除きますか (スラッシュを '?' に置き換えます)、または Unicode コード ポイントを非 Unicode システムに格納しますか?
最初に、128 を超える値をチェックして置換するループで実行できます。
「任意のプラットフォーム/フレームワーク/ライブラリ」を使用したくない場合は、独自のエンコーダーを作成する必要があります。それ以外の場合は、JQuery の .html(); を使用します。
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))))
関数の実装は、quote()
あなたが望むことをするかもしれません。私のバージョンはここにあります
eval()
エンコードを逆にするために使用できます。
var foo = 'Hägar';
var quotedFoo = quote(foo);
var unquotedFoo = eval(quotedFoo);
alert(foo === unquotedFoo);