Javascript 特殊字符'\u0098';读作'\u02dc&x27;使用charCodeAt()

Javascript 特殊字符'\u0098';读作'\u02dc&x27;使用charCodeAt(),javascript,servlets,unicode,character-encoding,iso-8859-1,Javascript,Servlets,Unicode,Character Encoding,Iso 8859 1,我正在从Java创建test.js,如下所示。Test.js实现函数d(),该函数作为参数接收特殊字符√('\u0098') 函数d()应该显示这个特殊字符的charCodeAt(),即152。但是,它显示732 请注意,字符152和732均由特殊字符«表示,如下所示 如何强制函数d()显示152而不是732?(字符集问题?)。谢谢 TEST.JAVA public void doPost(HttpServletRequest req, HttpServletResponse res) th

我正在从Java创建test.js,如下所示。Test.js实现函数d(),该函数作为参数接收特殊字符√('\u0098')

函数d()应该显示这个特殊字符的charCodeAt(),即152。但是,它显示732

请注意,字符152和732均由特殊字符«表示,如下所示

如何强制函数d()显示152而不是732?(字符集问题?)。谢谢

TEST.JAVA

public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
    res.setHeader("Content-Type", "text/javascript;charset=ISO-8859-1");
    res.setHeader("Content-Disposition","attachment;filename=test.js");
    res.setCharacterEncoding("ISO-8859-1");
    PrintWriter printer=res.getWriter();
    printer.write("function d(a){a=(a+\"\").split(\"\");alert(a[0].charCodeAt(0));};d(\""); // Writes beginning of d() function
    printer.write('\u0098'); // Writes special character as parameter of d()
    printer.write("\");"); // Writes end of d() function
    printer.close();
}
function d(a)
{
  a=(a+"").split("");
  alert(a[0].charCodeAt(0));
};
d("˜"); // Note special character representing '\u0098'
TEST.JS由TEST.JAVA创建

public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
    res.setHeader("Content-Type", "text/javascript;charset=ISO-8859-1");
    res.setHeader("Content-Disposition","attachment;filename=test.js");
    res.setCharacterEncoding("ISO-8859-1");
    PrintWriter printer=res.getWriter();
    printer.write("function d(a){a=(a+\"\").split(\"\");alert(a[0].charCodeAt(0));};d(\""); // Writes beginning of d() function
    printer.write('\u0098'); // Writes special character as parameter of d()
    printer.write("\");"); // Writes end of d() function
    printer.close();
}
function d(a)
{
  a=(a+"").split("");
  alert(a[0].charCodeAt(0));
};
d("˜"); // Note special character representing '\u0098'
TEST.HTML

<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body>
<script type="text/javascript" charset="ISO-8859-1" src="test.js"></script>
</body>
</html>

试试:

JavaScript也能理解
\unnn
,因此您可以使用所需的字符代码显式地形成字符串。

尝试:

JavaScript也能理解
\unnn
,因此可以使用所需的字符代码显式地形成字符串

请注意,字符152和732均由特殊字符√表示,如下所示

不是真的<代码>$明确表示字符U+02DC(732),因此
charCodeAt
做的事情是正确的。字符U+0098(152)是一个几乎从未使用过的不可见控制代码

诀窍在于
“ISO-8859-1”
对Java和web浏览器具有不同的含义。对于Java来说,它实际上是ISO-8859-1标准,它精确地映射到Unicode的前256个代码点。这包括一系列很少使用的C1控制字符,在128–159之间

然而,对于web浏览器,
“ISO-8859-1”
实际上意味着Windows代码页1252(西欧),一种将各种有用字符放在128–159块中的编码。这种行为源于早期的web浏览器,它们只使用机器默认代码页。当浏览器中添加了适当的Unicode和编码支持时,出于兼容性考虑,尽管Windows字符标记为ISO-8859格式不正确,但仍然需要继续支持这些字符

因此,当您在ISO-8859-1中从Java编写一个U+0098字符时,您将得到一个0x98字节,然后浏览器将其作为U+02DC读入。这通常是无害的,因为实际上从来没有人想使用范围在U+0080–U+009F的C1控制代码。但这确实令人困惑

这一古老的怪癖,以及与之相关的治疗
&#字符引用作为cp1252字节,最终作为HTML5的一部分进行记录和标准化,但仅适用于HTML解析规则。(不是XHTML5,因为它遵循更合理的XML规则。)这就是为什么引用的fileformat.info页面似乎误导性地说,U+0098的呈现方式类似于

如果确实需要提取字符的cp1252字节号,则必须使用查找表来帮助您,因为JavaScript无法看到这些信息。例如:

var CP1252EXTRAS= '\u20ac\u20ac\u201a\u0192\u201e\u2026\u2020\u2021\u02c6\u2030\u0160\u2039\u0152\u0152\u017d\u017d\u017d\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u02dc\u2122\u0161\u203a\u0153\u0153\u017e\u0178';

function getCodePage1252Byte(s) {
    var ix= CP1252EXTRAS.indexOf(s);
    if (ix!==-1)
        return 128+ix;
    var c= s.charCodeAt(0);
    if (c<128 || c>=160 && c<256)
        return c;
    return -1;
}
var CP1252EXTRAS='\u20ac\u20ac\u201a\u0192\u201e\u2026\u2020\u2021\u02c6\u2030\u0160\u2039\u0152\u0152\u017d\u017d\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u02dc\u2122\u0161\u203a\u0153\u0153\u017e\u0178';
函数GetCodePage1252字节{
var ix=CP1252EXTRAS.indexOf(s);
如果(ix!=-1)
返回128+ix;
var c=s.charCodeAt(0);
如果(c=160&&c
请注意,字符152和732均由特殊字符√表示,如下所示

不完全正确。
$
显然是字符U+02DC(732),因此
charCodeAt
做的是正确的。字符U+0098(152)是一种几乎从未使用过的不可见控制代码

诀窍在于,
“ISO-8859-1”
对Java和web浏览器有不同的含义。对于Java来说,它实际上是ISO-8859-1标准,它精确地映射到Unicode的前256个代码点。这包括一系列很少使用的128–159的C1控制字符

然而,对于web浏览器,
“ISO-8859-1”
实际上是指Windows代码页1252(西欧),一种将各种有用字符放在128–159块中的编码。这种行为源于早期的web浏览器,这些浏览器只使用机器默认代码页。当浏览器添加了适当的Unicode和编码支持时,兼容性问题要求继续支持Windows字符,尽管其标签不正确作为ISO-8859格式

因此,当您在ISO-8859-1中从Java编写一个U+0098字符时,您会得到一个0x98字节,然后被浏览器作为U+02DC读入。这通常是无害的,因为实际上没有人希望使用范围为U+0080–U+009F的C1控制代码。但这肯定会让人困惑

这一古老的怪癖,以及将128–159范围内的字符引用视为cp1252字节的相关怪癖,最终作为HTML5的一部分进行了记录和标准化,但仅限于HTML解析规则(而不是遵循更合理的XML规则的XHTML5)这就是为什么引用的fileformat.info页面似乎误导性地说U+0098的呈现方式类似于<代码>~

如果确实需要提取字符的cp1252字节号,则必须使用查找表来帮助您,因为JavaScript无法看到该信息。例如:

var CP1252EXTRAS= '\u20ac\u20ac\u201a\u0192\u201e\u2026\u2020\u2021\u02c6\u2030\u0160\u2039\u0152\u0152\u017d\u017d\u017d\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u02dc\u2122\u0161\u203a\u0153\u0153\u017e\u0178';

function getCodePage1252Byte(s) {
    var ix= CP1252EXTRAS.indexOf(s);
    if (ix!==-1)
        return 128+ix;
    var c= s.charCodeAt(0);
    if (c<128 || c>=160 && c<256)
        return c;
    return -1;
}
var CP1252EXTRAS='\u20ac\u20ac\u201a\u0192\u201e\u2026\u2020\u2021\u02c6\u2030\u0160\u2039\u0152\u0152\u017d\u017d\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u02dc\u2122\u0161\u203a\u0153\u0153\u017e\u0178';
函数GetCodePage1252字节{
var ix=CP1252EXTRAS.indexOf(s);
如果(ix!=-1)
返回128+ix;
var c=s.charCodeAt(0);

如果(c=160&&c在Javascript中用\\编译错误。但是我需要它是一个字符而不是整个\u0098字符串。谢谢为什么是双“\”?和Arturo,这是一个字符,转义就像在c/c++中一样。请尝试
“\u0098”