Вопрос

Мне нужно преобразовать большие строки 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top