【问题标题】:Can we convert Unicode to ASCII in Javascript? charCodeAt() is only for Unicode?我们可以在 Javascript 中将 Unicode 转换为 ASCII 吗? charCodeAt() 仅适用于 Unicode?
【发布时间】:2017-02-21 20:41:10
【问题描述】:

我们必须为我们的老师做一个小程序来获取Javascript中任何值的ASCII码。

我已经搜索和研究过,但似乎没有办法这样做。我只发现:

charCodeAt()

http://www.hacksparrow.com/get-ascii-value-of-character-convert-ascii-to-character-in-javascript.html

返回 Unicode 值,但不返回 ASCII。

我在这个论坛上读到,ASCII 值与已经具有 ASCII 值的 ASCII 字符的 Unicode 值相同:

Are Unicode and Ascii characters the same?

但似乎并非总是如此,例如扩展的 ASCII 字符。比如:

var myCaracter = "├";

var n = myCaracter.charCodeAt(0);

document.write (n);

该字符的 ASCII 值为 195,但程序返回 226(Unicode 值)。

我找不到从一种转换到另一种的模式,所以:

¿我们可以从 Unicode 中获取 ASCII,还是应该寻找其他方法?

谢谢!

【问题讨论】:

  • "The" ASCII 值不是给定的……好吧,归结为 non-ASCII 字符。我敢打赌 charCodeAt 是你老师所追求的。
  • ASCII 是 7 位代码,因此没有字符 195。扩展 ASCII 是一组许多 8 位代码的名称。没有单一可接受的 8 位“ASCII”代码。
  • 如果您要求“扩展 ASCII 字符”,那么您需要仔细描述您的意思是 哪个 扩展。毕竟,Unicode 只是 ASCII 的另一种扩展。
  • 请你的老师过来,告诉我们ASCII码和ASCII码的Unicode码位有什么区别。 charCodeAt 肯定会返回任何 ASCII 字符的 ASCII 码。毫无疑问。您实际上可以尝试使用任何 ASCII 字符,您可以在此处找到列表:en.wikipedia.org/wiki/ASCII

标签: javascript string unicode char ascii


【解决方案1】:

ASCII 字符仅使用 7 位,值从 0 到 127(00 到 7F 十六进制)。它们包括:

  • 控制字符(0 到 31,以及 127)
  • 数字(0 到 9,编码 48 到 57)
  • 大写字母(65 到 90)
  • 小写字母(97 到 122)
  • 标点符号和其他符号数量有限。

ASCII 字符是 Unicode(“C0 控件和基本拉丁语块”)的子集,它们在 UTF-8 中的编码完全相同。 “A”的 ASCII 码(65 或 0x41)与“A”的 Unicode 码点(U+0041)相同。

您正在考虑的字符 (├) 不是 ASCII。它是许多不同字符集/代码页的一部分,可能有不同的数值/编码,但绝对不是 ASCII。

这些字符甚至没有在最常见的 ASCII 8 位扩展(称为 ISO-8859-*)中定义。它是代码页 437(在 MS-DOS 上使用)的一部分,其数字代码是 0xC3 (195)。但这绝对不是 ASCII。

该字符的 Unicode 代码点是 U+251C(十进制 9500),这是该字符的 charCodeAt 返回值,而不是 226。

您可能得到 226,因为您正在解释一个未被识别的 UTF-8 字符串。

【讨论】:

  • 非常感谢@jcaron 的回答,但是如果它├ (alt+195) 不是 ASCII,为什么它包含在此表中并带有所有“扩展 ASCII 字符”?
  • 问题是我们对 UTF、Unicode、ASCII 一无所知……我们只了解了一点 ASCII,仅此而已。所以我认为你的帖子会对我有很大帮助:)
  • @FranP “最终,ISO 以 ISO 8859 的形式发布了这个标准,描述了它自己的一组 8 位 ASCII 扩展。” en.wikipedia.org/wiki/Extended_ASCII --- 那里读起来很有趣。
  • 那些不是 ASCII 字符。它们是Code page 437 字符,这是 ASCII 的众多超集之一(它对代码 0-127 使用相同的字符,对于 128-255 使用附加字符),但它不是 ASCII。还有许多其他 ASCII 超集,包括 ISO-8859-* 字符集、windows-1252 字符集、MacRoman 字符集,当然还有 Unicode(超过 0-255 可以包含更多个字符)。
  • 请注意,许多人说“ASCII 码”来描述与字符相关的数值,但这取决于所使用的字符集。如果不指定字符集,您将无法定义任何字符可以具有的数值,而 Unicode 和任何字符一样好(或者实际上,它要好得多,因为它包含了在许多不同字符集中定义的所有字符,每个只包括有限的子集)。
【解决方案2】:

今天我的老师道歉了,因为可能是她的错告诉我们charCodeAt()获取ASCII码是错误的;她希望我们使用这种方法,就像@Rad Lexus 建议的那样。

所以,在我的练习中它不是必需的,但作为一种练习并帮助每个可能需要它的人,我所做的是在代码中添加一个小的验证,以避免用户可以输入 ASCII 扩展大于或等于 128 的字符,charCodeAt() 的问题似乎开始了。

也许这不是一个聪明的解决方案,而且在我的练习中肯定没有必要,而且它使得其他语言中的一些必要字符(例如德语的ö或西班牙语的ñ)被禁止......但我认为最好发布代码,让使用它的每个人选择是否使用此验证。

感谢所有帮助过我的人。

定义函数:

function validate(text)
{

    var isValid=false;

    var i=0;


    if(text != null && text.length>0 && text !='' )
    {
        isValid=true;

        for (i=0;i<text.length;++i)/*this is not necessary, but I did*/
        {
            if(text.charCodeAt(i)>=128)
            {
                isValid=false;
            }
        }

    }

    return isValid;

}

使用函数

var isValid=false;

var position=0; 

while(isValid==false)
{
    text=prompt("Enter your text");

    isValid=validate(text);
}

【讨论】:

    猜你喜欢
    • 2020-02-20
    • 2013-03-14
    • 1970-01-01
    • 2015-05-08
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 2011-02-11
    相关资源
    最近更新 更多