Как преобразовать большие строки UTF-8 в ASCII?
-
08-07-2019 - |
Вопрос
Мне нужно преобразовать большие строки UTF-8 в ASCII.Он должен быть обратимым и в идеале представлять собой быстрый / облегченный алгоритм.
Как я могу это сделать?Мне нужен Источник код (с использованием циклов) или JavaScript код.(не должен зависеть от какой-либо платформы / фреймворка / библиотеки)
Редактировать: Я понимаю, что представление ASCII будет выглядеть некорректно и будет больше (в байтах), чем его аналог в формате UTF-8, поскольку это закодированная форма оригинала UTF-8.
Решение
Вы могли бы использовать версию функции кавычек Дугласа Крокфорда 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
например , quote("Doppelgänger!")
будет "Двойник!"
Чтобы отменить кодировку, вы можете просто оценить результат
var encoded = quote("Doppelgänger!");
var back = JSON.parse(encoded); // eval(encoded);
Другие советы
Любая строка UTF-8, которая обратимо преобразуется в ASCII, уже является ASCII.
UTF-8 может представлять любой символ Unicode - ASCII не может.
Как уже говорили другие, вы не можете конвертировать текст / обычный текст UTF-8 в текст / простой текст ASCII без удаления данных.
Вы можете конвертировать UTF-8 text / plain в ASCII что-то другое / формат. Например, HTML позволяет любому символу в UTF-8 представлять в файле данных ASCII, используя ссылки на символы .
Если продолжить этот пример, в JavaScript charCodeAt может помочь с преобразованием строки в ее представление с использованием ссылок на символы HTML.
Другой подход используется URL и реализован в JS как encodeURIComponent .
Ваше требование довольно странное.
Преобразование UTF-8 в ASCII приведет к потере всей информации о кодовых точках Unicode > 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 (косая черта замените их на '?' и т. д.) или хранить кодовые точки Unicode в системе, не поддерживающей Unicode?
Сначала можно выполнить цикл проверки значений > 128 и заменяя их.
Если вы не хотите использовать " любую платформу / инфраструктуру / библиотеку " тогда вам нужно будет написать свой собственный кодер. В противном случае я бы просто использовал JQuery .html ();
Невозможно преобразовать строку UTF-8 в ASCII, но можно кодировать Unicode как строку, совместимую с ASCII. Р>
Возможно, вы хотите использовать Punycode - это уже стандартная кодировка Юникода, которая кодирует все Юникод символы в ASCII. Для кода JavaScript проверьте этот вопрос а> р>
Пожалуйста, измените название и описание вашего вопроса, чтобы другие не проголосовали за него - не используйте преобразование терминов, используйте кодировку. Р>
Вот функция для преобразования акцентов UTF8 в Акценты ASCII (& # 224; & # 233; & # 232; & # 238; и т. д.) Если в строке есть ударение, оно конвертируется в% 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);