通过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 输出数据,然后 curlstdin 读取才行。

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分!的主要内容,如果未能解决你的问题,请参考以下文章

java 将编码格式为utf-8的文件内容以 GBK编码存到txt文档

HTML编码UTF-8转为GBK

网页如何转换编码

C#如何从UTF8转换成GBK

python3 requests爬取gbk时候遇到编码的坑

如何解决GBK转换UTF-8乱码问题