代码之家  ›  专栏  ›  技术社区  ›  Robin Rodricks

如何将大的UTF-8字符串转换成ASCII?

  •  3
  • Robin Rodricks  · 技术社区  · 16 年前

    我需要将大的UTF-8字符串转换成ASCII。它应该是可逆的,理想情况下是快速/轻量级的算法。

    我该怎么做?我需要 来源 代码(使用循环)或 JavaScript 代码。(不应依赖于任何平台/框架/库)

    编辑: 我理解,ASCII表示形式看起来不正确,并且(以字节为单位)比它的UTF-8对应形式更大,因为它是一种编码形式的UTF-8原始形式。

    9 回复  |  直到 7 年前
        1
  •  10
  •   Tracker1    10 年前

    您可以使用DouglasCrockford的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!") 将是“Doppelg\u00e4nger!”

    要恢复编码,只需计算结果

    var encoded = quote("Doppelgänger!");
    var back = JSON.parse(encoded); // eval(encoded);
    
        2
  •  10
  •   Neall    16 年前

    任何可以可逆地转换为ASCII的UTF-8字符串都已经是ASCII。

    UTF-8可以表示任何Unicode字符-ASCII不能。

        3
  •  5
  •   Quentin    16 年前

    正如其他人所说,如果不删除数据,就无法将UTF-8文本/纯格式转换为ASCII文本/纯格式。

    您可以将UTF-8文本/纯文本转换为ASCII其他/格式。例如,HTML允许任何UTF-8字符在ASCII数据文件中使用 character references .

    如果我们继续这个例子,在javascript中, charCodeAt 可以帮助使用HTML字符引用将字符串转换为它的表示形式。

    另一种方法是 URLs 并在JS中实现为 encodeURIComponent .

        4
  •  3
  •   Joachim Sauer    15 年前

    你的要求很奇怪。

    将UTF-8转换为ASCII将丢失有关Unicode码位的所有信息(即,所有不在ASCII中的信息)。

    但是,您可以尝试用与ASCII兼容的编码方式对Unicode数据进行编码(无论源代码是什么),例如 UTF-7 . 这意味着所产生的数据可以合法地解释为ASCII,但实际上是UTF-7。

        5
  •  2
  •   Guffa    16 年前

    如果字符串编码为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);
    
        6
  •  0
  •   Fowl    16 年前

    是否要删除所有非ASCII字符(斜线替换为“?”或者在非Unicode系统中存储Unicode代码点?

    首先可以在循环中检查并替换值>128。

    如果您不想使用“任何平台/框架/库”,那么您需要编写自己的编码器。否则我只使用jquery的.html();

        7
  •  0
  •   Community CDub    8 年前

    这是不可能的 转换 将UTF-8字符串转换为ASCII,但可以 编码 Unicode作为与ASCII兼容的字符串。

    可能你想用 Punycode -这已经是一种标准的Unicode编码,将所有Unicode字符编码为ASCII。对于javascript代码,请检查此 question

    请编辑您的问题标题和说明,以防止其他人投反对票-不要使用术语转换,使用编码。

        8
  •  0
  •   Francois Girard    10 年前

    下面是一个函数,用于将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;
    }
    
        9
  •  -1
  •   Christoph    7 年前

    实现 quote() 函数可以做您想要的。 我的版本 can be found here

    你可以使用 eval() 要反转编码:

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