큰 UTF-8 현을 ASCII로 변환하는 방법은 무엇입니까?
-
08-07-2019 - |
문제
큰 UTF-8 현을 ASCII로 변환해야합니다. 가역적이어야하며 이상적으로는 빠른/가벼운 알고리즘이어야합니다.
어떻게 할 수 있습니까? 나는 필요하다 원천 코드 (루프 사용) 또는 자바 스크립트 암호. (플랫폼/프레임 워크/라이브러리에 의존해서는 안됩니다)
편집하다: 나는 ASCII 표현이 UTF-8 원본의 인코딩 형태이기 때문에 UTF-8 대응 물보다 올바르게 보이고 (바이트 측면에서) 더 크다는 것을 이해한다.
해결책
Douglas Crockford의 JSON2.JS 견적 기능의 Ascii-only 버전을 사용할 수 있습니다. 다음과 같이 보일 것입니다.
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-anly, javaScript-quot을 생성합니다.
예를 들어 quote("Doppelgänger!")
"doppelg u00e4nger!"
인코딩을 되돌리려면 결과를 평가할 수 있습니다.
var encoded = quote("Doppelgänger!");
var back = JSON.parse(encoded); // eval(encoded);
다른 팁
ASCII로 가역적으로 변환되는 UTF-8 문자열은 이미 ASCII입니다.
UTF -8은 모든 유니 코드 문자를 나타낼 수 있습니다 -ASCII는 할 수 없습니다.
다른 사람들이 말했듯이, 데이터를 삭제하지 않고 UTF-8 텍스트/일반을 ASCII 텍스트/일반으로 변환 할 수는 없습니다.
UTF-8 텍스트/일반을 ASCII로 변환 할 수 있습니다. 예를 들어, HTML은 UTF-8의 모든 문자가 ASCII 데이터 파일을 사용하여 표현할 수 있도록합니다. 캐릭터 참조.
그 예를 계속하면 JavaScript에서 charcodeat HTML 문자 참조를 사용하여 문자열을 IT 표현으로 변환하는 데 도움이 될 수 있습니다.
또 다른 접근법은 URL, JS AS에서 구현되었습니다 encodeUricomponent.
귀하의 요구 사항은 매우 이상합니다.
UTF-8을 ASCII로 변환하면 유니 코드 코드 포인트> 127 (즉, ASCII가 아닌 모든 내용)에 대한 모든 정보가 느슨해집니다.
그러나 ASCII 호환 인코딩에서 유니 코드 데이터 (어떤 소스 인코딩에 관계없이)를 인코딩하려고 할 수 있습니다. UTF-7. 이는 생성 된 데이터가 법적으로 ASCII로 해석 될 수 있지만 실제로 UTF-7입니다.
문자열이 UTF-8으로 인코딩되면 더 이상 문자열이 아닙니다. 이진 데이터이며 이진 데이터를 ASCII로 표현하려면 제한된 ASCII 문자 세트를 사용하여 표현할 수있는 문자열로 포맷해야합니다.
한 가지 방법은 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 char (슬래시를 '?'등으로 교체하거나 비 유니 코드 시스템에 유니 코드 코드 포인트를 저장 하시겠습니까?
먼저 값> 128을 검사하고 교체 할 수 있습니다.
"모든 플랫폼/프레임 워크/라이브러리"를 사용하지 않으려면 자신의 인코더를 작성해야합니다. 그렇지 않으면 나는 단지 jQuery의 .html ()을 사용합니다.
다음은 UTF8 액센트를 ASCII 액센트 (àéèî 등)로 변환하는 기능이 있습니다. 문자열에 악센트가 있으면 반대편에 예보를 위해 %239로 변환됩니다. 나는 문자열을 구문 분석하고 Accent가있을 때를 알고 있습니다. 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);