javascript 字符串进行 utf8 编码的方法(转)
2024-08-31 02:48:50
实践中碰到了一个大问题,在 javascript 中,可能有一些中文字符串,我们想将其进行二进制流编码的时候,需要将其转换为 utf8 的编码。
也就是说,输入的是一个字符串:'呆滞的慢板今天挣了100块钱'
。
输出的是一个字节序列:
[229, 145, 134, 230, 187, 158, 231, 154, 132, 230, 133, 162,
230, 157, 191, 228, 187, 138, 229, 164, 169, 230, 140, 163,
228, 186, 134, 49, 48, 48, 229, 157, 151, 233, 146, 177]
又或者是这一个单字节的字符串:
"\xE5\x91\x86\xE6\xBB\x9E\xE7\x9A\x84\xE6\x85\xA2\xE6\x9D\xBF\xE4\xBB\x8A\xE5\xA4\xA9\xE6\x8C\xA3\xE4\xBA\x86100\xE5\x9D\x97\xE9\x92\xB1"
"åæ»çæ
¢æ¿ä»å¤©æ£äº100åé±"
经过不懈的折腾,终于搞明白了,有两种解决方案:
1. 支持 window.TextEncoder()
的情况
function str2utf8(str) {
encoder = new TextEncoder('utf8');
return encoder.encode(str);
}
这种返回的是一个整数数组。
2. 利用 encodeURI
的编码进行替换
原理是,如果使用 encodeURI(str)
,其中如果碰到中文字符之类的,就会按照 utf8 编码之后变成 %E5%91
这个样子,我们利用这个,完了之后再将 %
替换成 \x
,就得到了单个字节的串。
function str2utf8(str) {
return eval('\''+encodeURI(str).replace(/%/gm, '\\x')+'\'');
}
3. 综合使用
于是,我们综合来定义一个兼容的方案:
var str2utf8 = window.TextEncoder ? function(str) {
var encoder = new TextEncoder('utf8');
var bytes = encoder.encode(str);
var result = '';
for(var i = 0; i < bytes.length; ++i) {
result += String.fromCharCode(bytes[i]);
}
return result;
} : function(str) {
return eval('\''+encodeURI(str).replace(/%/gm, '\\x')+'\'');
}
【转载请附】愿以此功德,回向 >>
原文链接:http://www.huangwenchao.com.cn/2015/09/javascript-utf8-encoding.html【javascript 字符串进行 utf8 编码的方法】
最新文章
- lodop打印控件
- Java注解一谈
- Python 基础 - 统计文本里单词的个数以及出现的次数
- libevent
- flash 定义主舞台窗口大小
- java 泛型类
- BZOJ 1051 受欢迎的牛
- C语言中两个相等的char值比较 结果为false
- JavaScript重载解读
- PHP5.4 for Apache, php 5.4.0安装过程、方法、配置 ; Apache2.2支持php5.4的配置方法
- 五:Token问题和使用详解
- CountDownLatch使用
- Java虚拟机内存溢出异常--《深入理解Java虚拟机》学习笔记及个人理解(三)
- PairProject——结对编程
- 多目标遗传算法 ------ NSGA-II (部分源码解析)目标函数 problemdef.c
- MyEclipse配置默认自带的XML代码格式化
- ssh登陆过程图示
- java.lang.Error: Unresolved compilation problem: 解决方案
- 元素transform: rotate()之后,元素宽高该怎么计算?
- SQL相关简单游标
热门文章
- 关于new String(new byte[]{0})
- python能够执行,但编译第三包遇到 python.h no such file or directory
- swift中的nil与Objective-C中的nil区别
- Java教程到处都是,究竟怎样能学好Java?
- Django Error: That port is already in use.
- bootstrap学习笔记 多媒体对象
- js闭包避免内存泄漏 减少内存使用 避免对象无法回收注意事项
- Current thread must be set to single thread apartment (STA) mode before OLE,当前线程不在单线程单元中,因此无法实例化 ActiveX 控件“8856f961-340a-11d0-a96b-00c04fd705a2”。
- SSM整合开发流程
- 统一修改 UINavigationBar backItem