我们能否在 Javascript 中将 Unicode 转换为 ASCII?charCodeAt() 只适用于 Unicode 吗?

6
我们需要为我们的老师编写一个小程序,以获取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值相同:

Unicode和Ascii字符是相同的吗?

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

var myCaracter = "├";

var n = myCaracter.charCodeAt(0);

document.write (n);

那个字符的ASCII值为195,但程序返回226(Unicode值)。
我找不到从一个值转换到另一个值的模式,所以:
我们能否从Unicode获取ASCII,还是应该寻找其他方法?
谢谢!

2
"The"的ASCII值对于非ASCII字符来说并不是一个确定的值。我打赌你的老师想要的是charCodeAt函数。 - Jongware
2
ASCII是一种7位编码,因此没有字符195。扩展 ASCII是许多8位编码的名称。没有单一被接受的8位“ASCII”编码。 - Pointy
1
对于 ASCII 字符(在范围 0-127 内),Unicode 码点和 ASCII 值甚至 UTF-8 编码之间没有区别。如果你的老师告诉你 是一个 ASCII 字符,那么她是非常错误的。 - jcaron
3
请请求您的老师来这里并告诉我们ASCII码和Unicode码点之间在ASCII字符方面的区别。 charCodeAt 确定会返回任何ASCII字符的ASCII码,毫无疑问。您可以尝试使用任何ASCII字符进行测试,您可以在此处找到列表:https://en.wikipedia.org/wiki/ASCII - jcaron
1
@FranP 好的, 根本不是 ASCII 字符;这个符号在 ASCII 码中根本不存在。它在字符集中根本不存在。 - Pointy
显示剩余18条评论
2个回答

4

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

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

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

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

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

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

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


非常感谢您的回答@jcaron,但如果它不是ASCII,为什么它会包含在所有“扩展ASCII字符”的表中呢? - user6791921
问题是我们对UTF、Unicode、ASCII一无所知...我们只学了一点关于ASCII的知识,其他什么也不懂。所以我认为你的帖子会对我有很大帮助 :) - user6791921
2
那些不是ASCII字符。它们是代码页437字符,这是ASCII的众多超集之一(它使用相同的字符来表示0-127号码,以及128-255的附加字符),但它不是ASCII。还有许多其他的ASCII超集,包括ISO-8859-*字符集、windows-1252字符集、MacRoman字符集,当然还有Unicode(它超越了0-255,能够包括更多的字符)。 - jcaron
好的,班上的一位同学已经确认了,她说“Unicode值和ASCII不同,你必须寻找解决方案”。那么让我们看看她告诉我的是什么。 - user6791921
班上其他人只是在寻找一个模式,就像我一样,所以让我们看看她想要什么,或者她的解释。 - user6791921
显示剩余2条评论

2
今天我的老师道歉了,因为她告诉我们使用 charCodeAt() 获取 ASCII 码是错误的,可能这是她的错;她希望我们使用那种方法,就像 @Rad Lexus 建议的那样。
所以,在我的练习中没有必要这样做,但作为一种实践和帮助需要它的每个人,我已经在代码中添加了一个小的验证,以避免用户输入大于或等于 128 的 ASCII 扩展字符,其中 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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接