JavaScript中的Unicode

发布时间 2023-08-18 09:41:05作者: 晓风晓浪

JavaScript程序使用Unicode字符集编写,这意味着您可以在字符串和注释中使用任何Unicode字符。为了便于移植和编辑,建议在标识符中仅使用ASCII字母和数字。然而,这只是一种编程约定;语言本身支持在标识符中使用Unicode字母、数字和表意文字(但不支持表情符号)。这意味着常量或变量名可以包括数学符号或非英文字符:

const n = 3.14;
const sí = true;

Unicode转义序列。
一些计算机硬件和软件可能无法正确显示、输入或处理所有Unicode字符。为了方便编码并支持使用较旧技术的系统,JavaScript定义了转义序列,允许使用仅包含ASCII字符的方式表示Unicode字符。这些Unicode转义序列以\u开头,后跟四个十六进制数字(包括大写或小写字母A到F),或者它们可以用花括号括起来,由1到6个十六进制数字组成。Unicode转义序列可以出现在JavaScript字符串字面量、正则表达式字面量和标识符中(但不能出现在语言关键字中)。例如,字符“é”的Unicode转义序列是\u00E9。以下是在变量中使用此字符的三个示例:

// 使用Unicode字符定义一个变量
let café = 1;
// 使用转义序列访问变量
caf\u00E9
// 同一转义序列的另一形式
caf\u{E9}

早期版本的JavaScript只支持4位数的数值转义序列。花括号版本是在ES6中引入的,以更好地支持大于16位的Unicode码点,如表情符号:

// 打印一个笑脸表情符号
console.log("\u{1F600}");

Unicode转义序列也可以出现在注释中,但由于注释被忽略,注释中的转义序列被视为ASCII字符,不被解释为Unicode。

(程序员的软技能:ke.qq.com/course/6034346)

Unicode规范化。
如果在程序中使用非ASCII字符,您需要意识到Unicode允许相同字符的多种编码形式。例如,字符串“é”可以编码为Unicode字符\u00E9,也可以编码为常规ASCII字符“e”后跟组合重音符\u0301。这两种编码在文本编辑器中可能看起来相同,但它们具有不同的二进制表示。因此,JavaScript认为它们是不同的,这可能导致问题:

// 此常量命名为“caf\u{e9}”
const café = 1;
// 此常量不同:“cafe\u{301}”
const café = 2;
// => 1:此常量具有一个值
café
// => 2:这个不同的常量具有不同的值
café

Unicode标准为所有字符定义了首选编码,并指定了规范化程序,将文本转换为适用于比较的规范形式。JavaScript假设它解释的源代码已经被规范化,并且不执行任何规范化操作。如果您想在JavaScript程序中使用Unicode字符,请确保在您的编辑器或其他工具中使用Unicode规范化处理您的源代码,以避免出现看起来相同但实际上不同的标识符。

(程序员的软技能:ke.qq.com/course/6034346)