如何将编码为ANSI的文件转换成UTF-8的编码方式?

gucun_zhuang 2009-06-29 02:06:42
加精
我有个文件,内容是xml格式的。但是可气的是文件本身是ANSI的,却不是UTF-8编码。
所以我用DOM4J来导入就有问题。
请问,如何将文件解析成UTF-8的编码呢?
多谢了!~
...全文
5068 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
slacrey 2009-08-09
  • 打赏
  • 举报
回复
哪有那么麻烦!用记事本打开 选择保存的编码方式
gucun_zhuang 2009-07-13
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 jxst051665 的回复:]
用editplus转码
[/Quote]

我需要代码自动处理的。
jxst051665 2009-07-13
  • 打赏
  • 举报
回复
用editplus转码
laorer 2009-07-13
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 gucun_zhuang 的回复:]
你好,是的。


引用 16 楼 laorer 的回复:
引用 9 楼 gucun_zhuang 的回复:
我查到了ANSI文件前三个字节是60、63、120对应的是0x3C 、0x3F 、0x78。
是不是修改了流中的这三个,改为0xFE、0xBF、0xFF 就可以了?


你的意思是想读文件后,要先判断是否是 utf8,不是就转, 再读,是吗?
[/Quote]

你看下这个思路怎么样, (在 windows下应该可行,但在 linux 就不清楚了,而且 ansi 文件要有 bom 标识)
先读取相应的 xml 文件, 然后通过 bom 来判断是不是 utf8,如果不是, 就按我提供的那种方式(3楼),将其转成 utf8, 保存

后面的你再完成吧
gucun_zhuang 2009-07-13
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 kingstarer 的回复:]
读取源文件并生成另一个utf-8的文件行不行?
[/Quote]

这样做比较麻烦呀
gucun_zhuang 2009-07-13
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 xingqiliudehuanghun 的回复:]
1.用程序按ansi一行一行的读取
2.然后再一行一行的以utf-8格式输出到另一文件
3.将源文件删除
[/Quote]

你好,我也想过这么做。但是这样很麻烦,而且我要保持源文件的样子,不能随意改它的字符集。如果先处理成一个UTF8的文件,再对这个文件进行处理,是没有问题的。但是这样很麻烦。我想直接在内存中处理完成。
gucun_zhuang 2009-07-13
  • 打赏
  • 举报
回复
你好,是的。

[Quote=引用 16 楼 laorer 的回复:]
引用 9 楼 gucun_zhuang 的回复:
我查到了ANSI文件前三个字节是60、63、120对应的是0x3C 、0x3F 、0x78。
是不是修改了流中的这三个,改为0xFE、0xBF、0xFF 就可以了?



你的意思是想读文件后,要先判断是否是 utf8,不是就转, 再读,是吗?
[/Quote]
赵4老师 2009-07-09
  • 打赏
  • 举报
回复
convertz
用户 昵称 2009-07-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 norwolfli 的回复:]
如果就一个文件,你就另存为utf-8好了.

佛曰:
不知道为什么, 用 ultraEdit 以二进制查看生成的文件时,文件头部并没有以 EF BB BF 开头,但是以 windows 记事本打开后,另存为,可以发现其为 utf8 的. 我的 eclipse 的工作区的编码是 utf-8的,转换前,打开A.java 是乱码,转换后就可以正常显示了.

你没有往头部写EF BB BF,当然没有了.
[/Quote]

windows会尝试各种可能,并以他认为最恰当的方法来处理,如果一个文件是utf8的,却没有bom单身汉,用ansi方式来判断,会出来大量非本地字符,比如出来阿拉伯文字符,这就可能导致记事本换成utf8方式来处理。
qingtian881223 2009-07-08
  • 打赏
  • 举报
回复
学习,学习
YZYDLZR 2009-07-08
  • 打赏
  • 举报
回复
http://en.pudnet.com
robyjeffding 2009-07-08
  • 打赏
  • 举报
回复
顶一下!
kingstarer 2009-07-08
  • 打赏
  • 举报
回复
读取源文件并生成另一个utf-8的文件行不行?
  • 打赏
  • 举报
回复
1.用程序按ansi一行一行的读取
2.然后再一行一行的以utf-8格式输出到另一文件
3.将源文件删除
wnhj321 2009-07-08
  • 打赏
  • 举报
回复
说的好,真有才
liuyiyang88520 2009-07-08
  • 打赏
  • 举报
回复
好深奥
zhouyafeng325 2009-07-08
  • 打赏
  • 举报
回复
都是什么哦!!!
ltl164198 2009-07-08
  • 打赏
  • 举报
回复
20l真会拍马屁!佩服,佩服!
dzq138 2009-07-08
  • 打赏
  • 举报
回复

'4 UTF编码

'UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下:

'UCS-2编码(16进制) UTF-8 字节流(二进制)

'0000 - 007F 0xxxxxxx
'0080 - 07FF 110xxxxx 10xxxxxx
'0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
'例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,
'所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。'
'将6C49写成二进制是:0110 110001 001001, 用这个比特流依次代替模板中的x,
'得到:11100110 10110001 10001001,即E6 B1 89。

'读者可以用记事本测试一下我们的编码是否正确?
'UTF-16以16位为单元对UCS进行编码。对于小于0x10000的UCS码,UTF-16编码就等于UCS码对应的16位无符号整数。对于不小于0x10000的UCS码,定义了一个算法。不过由于实际使用的UCS2,或者UCS4的BMP必然小于0x10000,所以就目前而言,可以认为UTF-16和UCS-2基本相同。但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。


'UTF-8有点类似于Haffman编码,它将Unicode编码为00000000-0000007F的字符,用单个字节来表示;
'00000080-000007FF的字符用两个字节表示
'00000800-0000FFFF的字符用3字节表示
Function ByteStreamtoUTF8String(para_1() As Byte) As String
'功能:字节流转为字符串
'参数说明:para_1为需转换的字节流
Dim iLoop As Long
Dim jj As Currency
Dim tempstring As String
Dim lngstring As Long

On Error Resume Next
For iLoop = 0 To UBound(para_1)
'遍历转换字节流

If para_1(iLoop) > 0 And para_1(iLoop) <= 127 Then
'如果是ASCII
tempstring = tempstring & Chr(para_1(iLoop)) '得到ASCII表示的字符
ElseIf para_1(iLoop) >= 128 And para_1(iLoop) <= 223 Then
'如果是汉字
lngstring = ((CInt(para_1(iLoop)) - 128#) * 64#) '计算高位
iLoop = iLoop + 1
lngstring = lngstring + para_1(iLoop) - 128# '计算低位
tempstring = tempstring & ChrW(lngstring) '得到汉字
ElseIf para_1(iLoop) >= 224 Then
'如果是汉字
lngstring = ((CInt(para_1(iLoop)) - 224#) * 4096#)
iLoop = iLoop + 1
lngstring = lngstring + ((CInt(para_1(iLoop)) - 128#) * 64#) '计算高位
iLoop = iLoop + 1
lngstring = lngstring + para_1(iLoop) - 128# '计算低位
tempstring = tempstring & ChrW(lngstring) '得到汉字
End If
Next
tempstring = CStr(tempstring)
ByteStreamtoUTF8String = tempstring

'main.errmessage = New frmerrmessage("程序出现异常,无法正常运行!", "错误编码:A00031")
'main.errmessage.ShowDialog()
Exit Function

End Function
laorer 2009-07-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 gucun_zhuang 的回复:]
我查到了ANSI文件前三个字节是60、63、120对应的是0x3C 、0x3F 、0x78。
是不是修改了流中的这三个,改为0xFE、0xBF、0xFF 就可以了?
[/Quote]

你的意思是想读文件后,要先判断是否是 utf8,不是就转, 再读,是吗?

加载更多回复(22)

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧