字符编码

# [JavaScript 有个 Unicode 的天坑] 0014-D

unicode UTF UCS

Unicode:用一个码点(code point)映射一个字符。码点值的范围是从U+0000到U+10FFFF,可以表示超过110万个符号
Unicode最前面的65536个字符位,称为基本平面(BMP-—Basic Multilingual Plane),它的码点范围是从U+0000到U+FFFF
补充平面16个

UTF(Unicode transformation format)Unicode转换格式,是服务于Unicode的,用于将一个Unicode码点转换为特定的字节序列。
UTF-8 可变字节序列,用1到4个字节表示一个码点
UCS(Universal Character Set)通用字符集,是一个ISO标准,目前与Unicode可以说是等价的。

UTF-8对ASCⅡ编码是兼容的,都是一个字节,超过U+07FF的部分则用了复杂的转换方式来映射Unicode,
UTF-16对于BMP的码点,采用2个字节进行编码,而BMP之外的码点,用4个字节组成代理对
UCS-2是一个过时的编码方式,因为它只能编码基本平面(BMP)的码点,在BMP的编码上,与UTF-16是一致的,所以可以认为是UTF-16的一个子集。
UCS-4则与UTF-32等价,都是用4个字节来编码Unicode。

javascript字符处理

javascript(引擎) UCS-2 编码

坑1——length属性
坑2——反转字符串
坑3——码点与字符互转
坑4——正则匹配
ES6的Unicode支持

# [字符串js字符串与Unicode编码怎么做互相转换_百度知道] 0016-D

javascript字符普通处理

‘a’.charCodeAt(0)// 97
‘a’.charCodeAt().toString(16) //‘61’ 即’\u0061’

String.fromCharCode(97) // ‘a’
‘\u0061’ // ‘a’

//十进制转其他
var x=97; x.toString(16) // ‘61’
//其他转十进制
parseInt(61,16) // 97
//其他转其他
//先用parseInt转成十进制再用toString转到目标进制

[计算字符串字节数] x2 017-D

所以想办法在JavaScript中判断在UTF-8下存储的String的字节数,在网上找到很多关于Unicode介绍的文档,最重要的是字符编码数值对应的存储长度:

UCS-2编码(16进制) UTF-8 字节流(二进制)
0000 - 007F 0xxxxxxx (1字节)
0080 - 07FF 110xxxxx 10xxxxxx (2字节)
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx (3字节)

if(charset === ‘utf-16’ || charset === ‘utf16’){
}else{// utf-8
if (charCode < 0x007f) {
totalLength = totalLength + 1;
} else if ((0x0080 <= charCode) && (charCode <= 0x07ff)) {
totalLength += 2;
} else if ((0x0800 <= charCode) && (charCode <= 0xffff)) {
totalLength += 3;
}
}

# 补充: 计算JavaScript对象大小
JavaScript对象大小
js库:https://github.com/miktam/sizeof/blob/master/index.js
nodejs: npm install object-sizeof
Google Chrome 堆分析器允许你检查对象内存使用情况:后我在 profiler ( 录制录音后) 中找到了对象的完整大小以及它在”保留的大小”下的所有内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function roughSizeOfObject( value, level ) {
if(level == undefined) level = 0;
var bytes = 0;
if ( typeof value === 'boolean' ) {
bytes = 4;
}else if ( typeof value === 'string' ) {
bytes = value.length * 2;
}else if ( typeof value === 'number' ) {
bytes = 8;
}else if ( typeof value === 'object' ) {
if(value['__visited__']) return 0;
value['__visited__'] = 1;
for( i in value ) {
bytes += i.length * 2;
bytes+= 8;//an assumed existence overhead
bytes+= roughSizeOfObject( value[i], 1 )
}
}
if(level == 0){
clear__visited__(value);
}
return bytes;
}
function clear__visited__(value){
if(typeof value == 'object'){
delete value['__visited__'];
for(var i in value){
clear__visited__(value[i]);
}
}
}
roughSizeOfObject('a');//2
knowledge is no pay,reward is kindness
0%