通过javascript实现将网页编码从GBK转换为UTF-8,追加到200分!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过javascript实现将网页编码从GBK转换为UTF-8,追加到200分!相关的知识,希望对你有一定的参考价值。
通过javascript实现将网页编码从GBK转换为UTF-8,提供有效代码都追加到200分!
byte [] b;String utf8_value;
utf8_value = request.getParameter("NAME");//从HTTP流中取"NAME"的UTF8数据
b = utf8_value.getBytes("8859_1"); //中间用ISO-8859-1过渡
String name = new String(b, "GB2312"); //转换成GB2312字符
这是我做的一个项目程序的一段:
byte[] b;
String gbk_value;
gbk_value=request.getParameter("address");//从HTTP流中取"name"的GBK数据(由于web.xml中过滤器设置默认编码为GBK,所以外网从UTF-8变为GBK)
b=gbk_value.getBytes("GBK");//中间用GBK过渡,从GBK转换成GBK数组
String address=new String(b,"utf-8");//转换成utf-8字符
myform.setAddress(address);
在知道流长度的情况下将输入流转换成字节数组 Java中的输入流抽象类InputStream有int read(byte[] b, int off, int len)方法,参数中byte[] b是用来存放从InputStream中读取的数据,int off指定数组b的偏移地址,也就是数组b的起始下标,int len指定需要读取的长度,方法返回实际读取的字节数。
刚学Java 的朋友可能要说:先定义一个与流长度等长的字节数组,调用read方法,指定起始下标为0,指定读取长度与数组长度等长,不是一下子可以读出来了吗?说的 没错,笔者曾经也试着这样读取数据,但后来发现在读取网络数据时很不安全,我们想想在网络上获取数据可能并没那么流畅,数据流的传送可能会断断续续,所以 并不能保证一次就能读取全部数据,特别是在读取大容量数据时更是如此,所以我们必须在读取数据时检测实际读到的长度,如果没有读完已知长度的数据就应该再 次读取,以此循环检测,直到实际读取的长度累加与已知的长度相等,下面的代码实现了这一功能:
ServletInputStream inStream = request.getInputStream(); //取HTTP请求流
int size = request.getContentLength(); //取HTTP请求流长度
byte[] buffer = new byte[size]; //用于缓存每次读取的数据
byte[] in_b = new byte[size]; //用于存放结果的数组
int count = 0;
int rbyte = 0;
while (count < size)
//循环读取
rbyte = inStream.read(buffer); //每次实际读取长度存于rbyte中
for(int i=0;i
在不知道流长度的情况下将输入流转换成字节数组 前面介绍了已知流长度的情况下的转换方法,那么当我们不知道流有多长时,也就是说不能确定转换后的字节数组有多大时,该怎么处理呢?笔者查看了JDK文档 之后发现ByteArrayOutputStream有一个byte[] toByteArray()方法,该方法会自动创建一个字节数组,然后返回。于是就巧妙的用ByteArrayOutputStream来作中间过渡实现 转换,其它处理跟上面所介绍已知长度的情况差不多。假设需要被转换的流已经放在inStream里了,我们可以用如下的代码实现这一功能:
ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
byte[] buff = new byte[100]; //buff用于存放循环读取的临时数据
int rc = 0;
while ((rc = inStream.read(buff, 0, 100)) > 0)
swapStream.write(buff, 0, rc);
byte[] in_b = swapStream.toByteArray(); //in_b为转换之后的结果 参考技术A 晕!!!!
编码都是统一的啊
你有没有见过1个网页可以用GB2312显示正常。
当换成UTF-8又显示正常的。
用JAVASCRIPT也只能强行将字符串由gbk转换为utf-8的吧。
记录 curl 提交数据编码 及 javascript 转换 unicode 问题
1、curl 提交数据编码问题
在 windows
下使用 curl
发送一个 POST
请求的时候,遇到一个问题,传送的参数都不是 UTF-8
编码的。
- 1、在 git-bash 下测试,
locale
都是UTF-8
,没有作用,服务端收到的还是 GBK 编码。 - 2、在 cmd 下测试,
chcp 65001
,没有作用,,服务端收到的还是 GBK 编码。 - 3、写入脚本文件(sh/bat),在上述两种环境下,都还是 GBK 的。
最后只能是使用 echo
输出数据,然后 curl
从 stdin
读取才行。
echo ‘{"url":"这里有中文和zimu","time":1526129881}‘ | curl ‘http://192.168.17.11:8010/testsvr/post‘ -H ‘User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0‘ -H ‘Accept: application/json, text/plain, */*‘ -H ‘Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2‘ -H ‘Content-Type: application/json;charset=utf-8‘ -H ‘Origin: http://192.168.17.11:8010‘ -H ‘Connection: keep-alive‘ -H ‘Referer: http://192.168.17.11:8010/‘ -H ‘Cookie: id=cdfb03dfd29351d7b3aeb96b24218b86‘ -X POST-d @-
2、javascript 转换 UniCode 问题
网上很多转换代码是这样的:
function encodeUnicode(str) {
var res = [];
for ( var i=0; i<str.length; i++ ) {
res[i] = ( "00" + str.charCodeAt(i).toString(16) ).slice(-4);
}
return "\u" + res.join("\u");
}
这有一个问题,就是会把 ascii
字符也编码了,但很多时候,我们只需要编码非 ascii
字符,所以修改为下面
function encodeUnicode(str) {
var value = ‘‘;
for (var i = 0; i < str.length; i++) {
ch = str.charCodeAt(i);
if (ch > 127) {
value += ‘\u‘ + str.charCodeAt(i).toString(16);
} else {
value += str[i];
}
}
return value;
}
测试结果如下:
console.log(encodeUnicode(‘{"url":"这里有中文和zimu","time":1526129881}‘));
# 第一个结果
> "u007bu0022u0075u0072u006cu0022u003au0022u8fd9u91ccu6709u4e2du6587u548cu007au0069u006du0075u0022u002cu0022u0074u0069u006du0065u0022u003au0031u0035u0032u0036u0031u0032u0039u0038u0038u0031u007d"
# 第二个结果
> "{"url":"u8fd9u91ccu6709u4e2du6587u548czimu","time":1526129881}"
以上是关于通过javascript实现将网页编码从GBK转换为UTF-8,追加到200分!的主要内容,如果未能解决你的问题,请参考以下文章