Как преобразовать большие строки UTF-8 в ASCII? - PullRequest
3 голосов
/ 07 мая 2009

Мне нужно преобразовать большие строки UTF-8 в ASCII. Это должен быть обратимый и в идеале быстрый / легкий алгоритм.

Как я могу это сделать? Мне нужен код source (с использованием циклов) или код JavaScript . (не должно зависеть от какой-либо платформы / фреймворка / библиотеки)

Редактировать: Я понимаю, что представление ASCII не будет выглядеть корректно и будет больше (в байтах), чем его аналог UTF-8, поскольку это закодированная форма оригинала UTF-8.

Ответы [ 9 ]

10 голосов
/ 07 мая 2009

Вы можете использовать ASCII-версию функции цитаты Дугласа Крокфорда json2.js Который будет выглядеть так:

    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!") будет "Doppelg \ u00e4nger!"

Чтобы вернуть кодировку, вы можете просто оценить результат

var encoded = quote("Doppelgänger!");
var back = JSON.parse(encoded); // eval(encoded);
10 голосов
/ 07 мая 2009

Любая строка UTF-8, которая обратимо преобразуется в ASCII, уже является ASCII.

UTF-8 может представлять любой символ Unicode - ASCII не может.

5 голосов
/ 07 мая 2009

Как уже говорили другие, вы не можете преобразовать текст UTF-8 / обычный текст в текст ASCII / обычный текст без сброса данных.

Вы можете конвертировать UTF-8 текст / обычный текст в ASCII. Например, HTML позволяет любому символу в UTF-8 представлять в файле данных ASCII, используя символьные ссылки .

Если продолжить этот пример, в JavaScript charCodeAt может помочь преобразовать строку в ее представление с использованием ссылок на символы HTML.

Другой подход используется URL и реализован в JS как encodeURIComponent .

3 голосов
/ 07 мая 2009

Ваше требование довольно странное.

Преобразование UTF-8 в ASCII приведет к потере всей информации о кодовых точках Unicode> 127 (то есть всего, чего нет в ASCII).

Однако вы можете попытаться закодировать данные Unicode (независимо от того, какая кодировка источника) в ASCII-совместимую кодировку, такую ​​как UTF-7 . Это будет означать, что полученные данные могут юридически интерпретироваться как ASCII, но на самом деле это UTF-7.

2 голосов
/ 07 мая 2009

Если строка закодирована как 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);
0 голосов
/ 23 апреля 2015

Вот функция для преобразования акцентов 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;
}
0 голосов
/ 23 декабря 2009

Невозможно преобразовать строку UTF-8 в ASCII, но можно кодировать Unicode как ASCII-совместимую строку.

Возможно, вы хотите использовать Punycode - это уже стандартная кодировка Unicode, которая кодирует все символы Unicode в ASCII. Для кода JavaScript проверьте этот вопрос

Пожалуйста, измените название и описание вашего вопроса, чтобы другие не проголосовали за него - не используйте преобразование терминов, используйте кодировку.

0 голосов
/ 07 мая 2009

Вы хотите удалить все символы не ascii (косая черта замените их на '?' И т. Д.) Или сохранить кодовые точки Unicode в системе, не поддерживающей Unicode?

Сначала можно выполнить цикл, проверяя значения> 128 и заменяя их.

Если вы не хотите использовать «какую-либо платформу / фреймворк / библиотеку», вам нужно написать собственный кодировщик. В противном случае я бы просто использовал JQuery .html ();

0 голосов
/ 07 мая 2009

Реализация функции quote() может делать то, что вы хотите. Мою версию можно найти здесь

Вы можете использовать eval(), чтобы изменить кодировку:

var foo = 'Hägar';
var quotedFoo = quote(foo);
var unquotedFoo = eval(quotedFoo);
alert(foo === unquotedFoo);
...