繁体   English   中英

如何将大型 UTF-8 字符串转换为 ASCII?

[英]How to convert large UTF-8 strings into ASCII?

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

我怎样才能做到这一点? 我需要代码(使用循环)或JavaScript代码。 (不应依赖于任何平台/框架/库)

编辑:我知道 ASCII 表示看起来不正确并且会比它的 UTF-8 对应物更大(就字节而言),因为它是 UTF-8 原始的编码形式。

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

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

您可以使用仅限ASCII版本的Douglas Crockford的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-only,javascript引用的输入字符串

例如, quote("Doppelgänger!")将是“Doppelg \\ u00e4nger!”

要恢复编码,您只需评估结果即可

var encoded = quote("Doppelgänger!");
var back = JSON.parse(encoded); // eval(encoded);

正如其他人所说,你不能在不丢弃数据的情况下将UTF-8 text / plain转换为ASCII text / plain。

您可以将UTF-8 text / plain转换为ASCII格式/格式。 例如,HTML允许UTF-8中的任何字符使用字符引用表示在ASCII数据文件中。

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

另一种方法是URL ,并在JS中作为encodeURIComponent实现

你的要求很奇怪。

将UTF-8转换为ASCII将丢失有关Unicode代码点> 127的所有信息(即所有不是ASCII的信息)。

但是,您可以尝试使用ASCII兼容编码(例如UTF-7 )对Unicode数据进行编码(无论采用何种源编码)。 这意味着生成的数据可以合法地解释为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);

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

可能你想使用Punycode - 这已经是一个标准的Unicode编码,它将所有Unicode字符编码为ASCII。 对于JavaScript代码,请检查此问题

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

这是一个将UTF8重音转换为ASCII口音(àéèîetc)的函数。如果字符串中有重音,它将转换为%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;
}
function utf8ToAscii(str) {
    /**
     * ASCII contains 127 characters.
     * 
     * In JavaScript, strings is encoded by UTF-16, it means that
     * js cannot present strings which charCode greater than 2^16. Eg:
     * `String.fromCharCode(0) === String.fromCharCode(2**16)`
     *
     * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMString/Binary
     */
    const reg = /[\x7f-\uffff]/g; // charCode: [127, 65535]
    const replacer = (s) => {
        const charCode = s.charCodeAt(0);
        const unicode = charCode.toString(16).padStart(4, '0');
        return `\\u${unicode}`;
    };

    return str.replace(reg, replacer);
}

你想剥离所有非ascii字符(斜杠用'?'替换它们等)或者在非unicode系统中存储Unicode代码点吗?

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

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

quote()函数的实现可能会执行您想要的操作。 我的版本可以在这里找到

您可以使用eval()来反转编码:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM