ASCII(美国信息交换标准代码)是一种基于拉丁字母的字符编码系统,它将0-127之间的整数映射到对应的字符,是计算机中最基础且广泛使用的字符编码之一,在JavaScript中,处理ASCII码与字符之间的转换是常见的文本操作需求,掌握相关方法不仅能提升代码效率,还能更好地理解字符编码的底层逻辑。

ASCII码基础与JavaScript中的字符编码关系
ASCII码最初设计为7位编码,共定义128个字符,包括33个控制字符(如换行符n的ASCII码为10、回车符r为13)和95个可打印字符(包括数字0-9、大写字母A-Z、小写字母a-z以及标点符号),数字0对应的ASCII码是48,字母A是65,a是97,空格字符是32。
JavaScript使用Unicode字符编码,而ASCII码是Unicode的子集(Unicode的前128个字符与ASCII码完全一致),这意味着在JavaScript中,处理ASCII码本质上是处理Unicode码点中0-127范围内的值,因此可以直接通过内置方法实现转换,无需额外库支持。
JavaScript中ASCII码与字符转换的核心方法
JavaScript提供了两个核心方法用于ASCII码与字符的相互转换:String.fromCharCode()和String.prototype.charCodeAt()。
String.fromCharCode():将ASCII码转换为字符
该方法属于String对象的静态方法,用于将一个或多个ASCII码(或Unicode码点)转换为对应的字符拼接成的字符串,语法为:
String.fromCharCode(num1[, num2[, ...[, numN]]])
参数num1到numN是0-65535之间的整数(超出范围的值会被取模处理,即num % 65536),代表需要转换的ASCII码或Unicode码点。
示例:
// 单个ASCII码转字符 console.log(String.fromCharCode(65)); // 输出 'A' console.log(String.fromCharCode(97)); // 输出 'a' console.log(String.fromCharCode(48)); // 输出 '0' // 多个ASCII码转字符串 console.log(String.fromCharCode(72, 101, 108, 108, 111)); // 输出 'Hello'
注意事项:

- 如果传入的参数超出Unicode码点范围(如大于0x10FFFF),方法会抛出
RangeError。 - 对于代理对(surrogate pair,即表示某些特殊Unicode字符的两个16位值,如emoji),需分别传入高位和低位代理值,例如
String.fromCharCode(0xD83D, 0xDE00)输出😀。
String.prototype.charCodeAt():将字符转换为ASCII码
该方法属于字符串实例的方法,用于返回指定索引位置的字符对应的Unicode码点(对于ASCII字符,即ASCII码),语法为:
str.charCodeAt(index)
参数index是字符在字符串中的位置(从0开始),若省略或超出范围,默认返回NaN。
示例:
// 单个字符转ASCII码
console.log('A'.charCodeAt(0)); // 输出 65
console.log('a'.charCodeAt(0)); // 输出 97
console.log(' '.charCodeAt(0)); // 输出 32
// 字符串逐个字符转ASCII码数组
const str = 'Hello';
const asciiArray = [];
for (let i = 0; i < str.length; i++) {
asciiArray.push(str.charCodeAt(i));
}
console.log(asciiArray); // 输出 [72, 101, 108, 108, 111] 注意事项:
- 对于代理对字符(如😀),
charCodeAt(0)返回高位代理值(0xD83D),charCodeAt(1)返回低位代理值(0xDE00),此时需结合codePointAt()方法获取完整码点(😀的完整码点是128512)。 - 若字符的Unicode码点超出0xFFFF(如某些生僻字),
charCodeAt()仍返回16位代理值,而非完整码点。
ASCII码与字符转换的常见应用场景
文本加密与解密
简单的加密算法可通过ASCII码偏移实现,凯撒密码”:将每个字符的ASCII码加固定值(如3),解密时再减去该值。
// 加密函数
function encrypt(str, shift) {
return str.split('').map(char => {
const code = char.charCodeAt(0);
return String.fromCharCode((code - 32 + shift) % 95 + 32); // 32-126是可打印ASCII范围
}).join('');
}
// 解密函数
function decrypt(str, shift) {
return encrypt(str, -shift);
}
console.log(encrypt('Hello', 3)); // 输出 'Khoor'
console.log(decrypt('Khoor', 3)); // 输出 'Hello' 数据校验与过滤
检查输入是否为纯ASCII字符(如用户名、密码限制),或过滤非ASCII字符:
// 检查字符串是否全为ASCII字符
function isASCII(str) {
return str.split('').every(char => char.charCodeAt(0) < 128);
}
console.log(isASCII('Hello123')); // true
console.log(isASCII('你好')); // false
// 过滤非ASCII字符
function filterNonASCII(str) {
return str.split('').filter(char => char.charCodeAt(0) < 128).join('');
}
console.log(filterNonASCII('Hello世界')); // 'Hello' 字符串与二进制/十六进制转换
将字符串转换为ASCII码数组,再进一步转换为二进制或十六进制表示:

// 字符串转ASCII码数组,再转十六进制字符串
function stringToHex(str) {
return str.split('').map(char =>
char.charCodeAt(0).toString(16).padStart(2, '0')
).join(' ');
}
console.log(stringToHex('Hi')); // '48 69' ASCII码对照表(部分常见字符)
为便于理解,以下是部分常见ASCII码与字符的对照关系:
| 十进制 | 十六进制 | 字符 | 说明 |
|---|---|---|---|
| 32 | 0x20 | 空格 | 可打印字符 |
| 48-57 | 0x30-0x39 | 0-9 | 数字 |
| 65-90 | 0x41-0x5A | A-Z | 大写字母 |
| 97-122 | 0x61-0x7A | a-z | 小写字母 |
| 10 | 0x0A | n | 换行(控制字符) |
| 13 | 0x0D | r | 回车(控制字符) |
| 127 | 0x7F | DEL | 删除(控制字符) |
注意事项与最佳实践
- 范围限制:ASCII码仅支持0-127,若需处理非ASCII字符(如中文、emoji),应使用Unicode相关方法(如
codePointAt())。 - 代理对处理:对于超出BMP(基本多语言平面)的字符(如emoji),
charCodeAt()返回的是代理对,需避免直接拼接导致乱码。 - 参数校验:使用
charCodeAt()时,需检查索引是否有效(如str.charCodeAt(index)前判断index >= 0 && index < str.length),避免返回NaN。
相关问答FAQs
问题1:JavaScript中如何将字符串批量转换为ASCII码数组?
解答:可以通过遍历字符串的每个字符,使用charCodeAt()方法获取对应的ASCII码(或Unicode码点),并存入数组。
function stringToAsciiArray(str) {
return Array.from(str).map(char => char.charCodeAt(0));
}
console.log(stringToAsciiArray("Hi")); // [72, 105] 若需严格限制ASCII字符,可过滤掉码点大于127的字符:
function stringToStrictAsciiArray(str) {
return Array.from(str)
.filter(char => char.charCodeAt(0) < 128)
.map(char => char.charCodeAt(0));
}
解答:ASCII码范围是0-127,而charCodeAt()返回的是字符的Unicode码点,对于ASCII字符(如'A'、'1'),Unicode码点与ASCII码相同(65、49);但对于非ASCII字符(如中文'中'、emoji),Unicode码点会超出127(如'中'的码点是20013),此时返回的值就不是ASCII码了,若需严格处理ASCII字符,可判断返回值是否在0-127范围内:
function isAsciiChar(char) {
const code = char.charCodeAt(0);
return code >= 0 && code <= 127;
}
console.log(isAsciiChar('A')); // true
console.log(isAsciiChar('中')); // false 【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复