实践中碰到了一个大问题,在 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 编码的方法】

javascript 字符串进行 utf8 编码的方法(转)的更多相关文章

  1. 中文字符串和UTF-8编码字符串相互转换

    中文字符串和UTF-8编码字符串相互转换 //UTF字符转换 var UTFTranslate = { Change: function(pValue) { ) { ).replace(/(%u)(\ ...

  2. 萌新笔记——C++里将string类字符串(utf-8编码)分解成单个字(可中英混输)

    最近在建词典,使用Trie字典树,需要把字符串分解成单个字.由于传入的字符串中可能包含中文或者英文,它们的字节数并不相同.一开始天真地认为中文就是两个字节,于是很happy地直接判断当前位置的字符的A ...

  3. C++里将string类字符串(utf-8编码)分解成单个字(可中英混输)

    最近在建词典,使用Trie字典树,需要把字符串分解成单个字.由于传入的字符串中可能包含中文或者英文,它们的字节数并不相同.一开始天真地认为中文就是两个字节,于是很happy地直接判断当前位置的字符的A ...

  4. form表单的字符串进行utf-8编码

    <form>表单有assept-charset属性.该属性规定字符的编码方式,默认是"unknown",与文档的字符集相同. 该属性除了Internet explore ...

  5. JavaScript 字符串函数 之查找字符方法(一)

    1.JavaScript查找字符方法   首先看一张 有关字符串函数的查找字符的方法图 接下里补充里面的方法说明 2.charAt()     charAt() 方法返回字符串中指定位置的字符 语法 ...

  6. JavaScript字符串、数组、对象方法总结

    字符串方法 示例字符串: const str = "hello,kitty,hello,vue "; 一.基本方法 charAt(n) 返回指定索引的字符 charCodeAt(n ...

  7. javascript 字符串加密的几种方法

    8进制 /*8进制加密*/ function EnEight(){ var monyer = new Array();var i,s; for(i=0;i<txt.value.length;i+ ...

  8. 通过javascript进行UTF-8编码

    通过javascript进行UTF-8编码 javascript的字符集: javascript程序是使用Unicode字符集编写的.Unicode是ASCII和Latin-1的超集,并支持地球上几乎 ...

  9. JavaScript进行UTF-8编码与解码

    JavaScript本身可通过charCodeAt方法得到一个字符的Unicode编码,并通过fromCharCode方法将Unicode编码转换成对应字符. 但charCodeAt方法得到的应该是一 ...

随机推荐

  1. Vue 作用域插槽

    使用场景:复用子组件的slot,又可以使slot的内容不一样. <!DOCTYPE html> <html lang="zh"> <head> ...

  2. 资源管理器也玩多标签:QT TabBar v1.5.0.0a3

    http://zmingcx.com/explorer-also-play-more-tags-qt-tabbar-v1-5-0-0a3.html浏览器中的标签浏览功能非常受欢迎,安装QT TabBa ...

  3. 多校第九场Arithmetic Sequence题解

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5400 题意:给定等差数列的差值d1,d2.问长度为n的数列中有多少个满足条件的子序列,条件为子序列中 ...

  4. NOPcommerce研究

    http://www.cnblogs.com/gusixing/archive/2012/04/07/2435873.html

  5. [获取行数]php读取大文件提供性能的方法,PHP的stream_get_line函数读取大文件获取文件的行数的方...

    背景: 下面是获取文件的行数的方法: 一个文件如果知道有几行的话,就可以控制获取一定的行数的数据,然后放入数据库.这样不管的读取大文件的性能,还是写入数据库的性能,都能得到很大的提高了. 下面是获取文 ...

  6. [svc][jk]监控jvm的一个坑

    监控jvm的一个坑 1,遇到的问题 我按照以往文档,在catalina.sh里追加jvm的监控api,如下 紧接着我启动 tomcat. 未报任何错误. 发现 lsof –i:12000, 12000 ...

  7. .htaccess中的apache rewrite规则写法详解

    .htaccess中的apache rewrite写法: 1 RewriteEngine On 2 RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ 3 Rewr ...

  8. QT界面 理解QStyle和QStyleOption以及QStyleFactory

    QStyleOption类和QStyle类简介 QStyleOption类存储QStyle函数使用的参数.QStyleOption及其子类包含了QStyle函数绘制图形元素所需的所有信息. 由于性能原 ...

  9. [搬运]CORBA中BOA和POA的含义

    先来BOA,搬自:http://www.cl.cam.ac.uk/research/dtg/attarchive/omniORB/doc/2.8/omniORB2/node6.html The Bas ...

  10. 循环节计算---用到find函数

    #include <iostream> #include <algorithm> #include <vector> using namespace std; in ...