应该如何彻底解决UTF8编码转换成GB2312编码问题?

我需要将从人家网站传来的的UTF8编码的字符转换成GB2312,用函数转换确实可行,但这个UTF8转GB2312编码的函数,运行起来感觉非常消耗资源,有时甚至会造成死机。
在不修改服务器设置的前提下,我应该如何解决这个问题呢?有没有抛弃函数的转换办法,或者谁能提供一个更高效的函数?
请有过这方面的高手指点,非常感谢。

UTF8转GB2312的原函数如下(好像网上的都是这个函数):
<%
function UTF2GB(UTFStr)
for Dig=1 to len(UTFStr)
if mid(UTFStr,Dig,1)="%" then
if len(UTFStr) >= Dig+8 then
GBStr=GBStr & ConvChinese(mid(UTFStr,Dig,9))
Dig=Dig+8
else
GBStr=GBStr & mid(UTFStr,Dig,1)
end if
else
GBStr=GBStr & mid(UTFStr,Dig,1)
end if
next
UTF2GB=GBStr
end function

function ConvChinese(x)
A=split(mid(x,2),"%")
i=0
j=0

for i=0 to ubound(A)
A(i)=c16to2(A(i))
next

for i=0 to ubound(A)-1
DigS=instr(A(i),"0")
Unicode=""
for j=1 to DigS-1
if j=1 then
A(i)=right(A(i),len(A(i))-DigS)
Unicode=Unicode & A(i)
else
i=i+1
A(i)=right(A(i),len(A(i))-2)
Unicode=Unicode & A(i)
end if
next

if len(c2to16(Unicode))=4 then
ConvChinese=ConvChinese & chrw(int("&H" & c2to16(Unicode)))
else
ConvChinese=ConvChinese & chr(int("&H" & c2to16(Unicode)))
end if
next
end function

function c2to16(x)
i=1
for i=1 to len(x) step 4
c2to16=c2to16 & hex(c2to10(mid(x,i,4)))
next
end function

function c2to10(x)
c2to10=0
if x="0" then exit function
i=0
for i= 0 to len(x) -1
if mid(x,len(x)-i,1)="1" then c2to10=c2to10+2^(i)
next
end function

function c16to2(x)
i=0
for i=1 to len(trim(x))
tempstr= c10to2(cint(int("&h" & mid(x,i,1))))
do while len(tempstr)<4
tempstr="0" & tempstr
loop
c16to2=c16to2 & tempstr
next
end function

function c10to2(x)
mysign=sgn(x)
x=abs(x)
DigS=1
do
if x<2^DigS then
exit do
else
DigS=DigS+1
end if
loop
tempnum=x

i=0
for i=DigS to 1 step-1
if tempnum>=2^(i-1) then
tempnum=tempnum-2^(i-1)
c10to2=c10to2 & "1"
else
c10to2=c10to2 & "0"
end if
next
if mysign=-1 then c10to2="-" & c10to2
end function
%>
求最高效的编程解决方案,最好能详细说明。

整理 MySQL 8.0 文档时发现一个变更:
默认字符集由 latin1 变为 utf8mb4。想起以前整理过字符集转换文档,升级到 MySQL 8.0 后大概率会有字符集转换的需求,在此正好分享一下。
当时的需求背景是:
部分系统使用的字符集是 utf8,但 utf8 最多只能存 3 字节长度的字符,不能存放 4 字节的生僻字或者表情符号,因此打算迁移到 utf8mb4。
迁移方案一1. 准备新的数据库实例,修改以下参数:[mysqld]## Character Settingsinit_connect='SET NAMES utf8mb4'#连接建立时执行设置的语句,对super权限用户无效character-set-server = utf8mb4collation-server = utf8mb4_general_ci#设置服务端校验规则,如果字符串需要区分大小写,设置为utf8mb4_binskip-character-set-client-handshake#忽略应用连接自己设置的字符编码,保持与全局设置一致## Innodb Settingsinnodb_file_format = Barracudainnodb_file_format_max = Barracudainnodb_file_per_table = 1innodb_large_prefix = ON#允许索引的最大字节数为3072(不开启则最大为767字节,对于类似varchar(255)字段的索引会有问题,因为255*4大于767)

2. 停止应用,观察,确认不再有数据写入
可通过 show master status 观察 GTID 或者 binlog position,没有变化则没有写入。
3. 导出数据
先导出表结构:mysqldump -u -p --no-data --default-character-set=utf8mb4 --single-transaction --set-gtid-purged=OFF --databases testdb > /backup/testdb.sql
后导出数据:mysqldump -u -p --no-create-info --master-data=2 --flush-logs --routines --events --triggers --default-character-set=utf8mb4 --single-transaction --set-gtid-purged=OFF --database testdb > /backup/testdata.sql

4. 修改建表语句
修改导出的表结构文件,将表、列定义中的 utf8 改为 utf8mb4
5. 导入数据
先导入表结构:mysql -u -p testdb < /backup/testdb.sql
后导入数据:mysql -u -p testdb < /backup/testdata.sql

6. 建用户
查出旧环境的数据库用户,在新数据库中创建
7. 修改新数据库端口,启动应用进行测试
关闭旧数据库,修改新数据库端口重启,启动应用
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-09-24
你要实现转换, 我给你写点我的经验吧.

<%
public String convert(String str)
{
String result="";
try {
result=new String(str.getBytes("UTF-8"),"gb2312");
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
return result;
}

%>

然后在下面就可以String names=this.convert((String) ses.getAttribute("name"));
进行转换了;
我一般都是这样转换的.
你也可以改一下.用Static方法. 搞到另一个类里面,方便调用;本回答被提问者采纳
第2个回答  2015-11-11

    GB2312的范围比GBK少很多,也就是说所涵盖的中文字符会比GBK格式的少,一旦遇到没办法识别的繁体字或者特殊符号就会乱码。

    所以一般来说我会选GBK格式来写页面。至于UTF-8嘛,一般我写java的时候才会用到,这种一般适用于大型系统,或者跨语言系统,跨服务器等情况下使用。也就是说国外的ie浏览器也可以直接浏览到中文,而不需要安装中文语言支持包。

    主要是看你的使用范围,还有就是数据库支持那种编码,这个要跟你数据库的编码对应上来,否则一样会存在乱码的情况。

    以上就是建议,望采纳!

第3个回答  2006-11-21
最简单的方法:

用记事本打开你的源文件,然后选择另存为.在弹出的对话框中的"编码"选择"UTF-8",保存即可]

如果文件多,可用editplus(一个写程序常用的文本编辑器).一次性打开多个文件,打开时有个选项是"以XXX方式打开"(大概是这样的文字内容),选择UTF8-方式.然后另存为就行了.

快给分.
第4个回答  2006-11-24
Response.CharSet("GB2312")
使用这种方式直接输出呢?

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网