我有个文件,内容是xml格式的。但是可气的是文件本身是ANSI的,却不是UTF-8编码。
所以我用DOM4J来导入就有问题。
请问,如何将文件解析成UTF-8的编码呢?
多谢了!~
所以我用DOM4J来导入就有问题。
请问,如何将文件解析成UTF-8的编码呢?
多谢了!~
解决方案 »
- 从TXT 中读取 2维数组
- <xsd:element saw-name:hello="world"/>如何解析?
- 初学者的问题:为什么container类的引用声明不是通过new container()来实现呢?
- java里面有SqlParameter这个对象吗?
- 用poi把excel 导入sqlserver 问题!请各位指教!
- 高手们,如何解决在分发中版本的问题?
- 我妹妹要考JAVA, 有几道题不知道怎么做,请大家帮忙(在线等)
- 使用RMI技术实现HelloWorld程序时遇到的问题,请帮忙看看!
- 【求助】怎么依次执行线程?
- 各位大侠,有没有用过Mirosoft的JDBC的driver的,请进来,帮我一把
- 如何用边界符写开头的正则表达式
- 怎个算法??
我博客上有个private static void transferFile(String srcFileName, String destFileName) throws IOException {
String line_separator = System.getProperty("line.separator");
FileInputStream fis = new FileInputStream(srcFileName);
StringBuffer content = new StringBuffer();
DataInputStream in = new DataInputStream(fis);
BufferedReader d = new BufferedReader(new InputStreamReader(in, "GBK"));// , "UTF-8"
String line = null;
while ((line = d.readLine()) != null)
content.append(line + line_separator);
d.close();
in.close();
fis.close();
Writer ow = new OutputStreamWriter(new FileOutputStream(destFileName), "utf-8");
ow.write(content.toString());
ow.close();
}将一个GBK编码的文件转成UTF8 编码的文件,有兴趣的话,你可以试下不知道为什么, 用 ultraEdit 以二进制查看生成的文件时,文件头部并没有以 EF BB BF 开头,但是以 windows 记事本打开后,另存为,可以发现其为 utf8 的. 我的 eclipse 的工作区的编码是 utf-8的,转换前,打开A.java 是乱码,转换后就可以正常显示了.
如果你觉得有什么问题,可以联系我,一起讨论下.....//参考了 字符,字节和编码 http://www.regexlab.com/zh/encoding.htm................
不知道为什么, 用 ultraEdit 以二进制查看生成的文件时,文件头部并没有以 EF BB BF 开头,但是以 windows 记事本打开后,另存为,可以发现其为 utf8 的. 我的 eclipse 的工作区的编码是 utf-8的,转换前,打开A.java 是乱码,转换后就可以正常显示了.你没有往头部写EF BB BF,当然没有了.
private String toUTF8(String s) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= 0 && c <= 255) {
sb.append(c);
} else {
byte[] b;
try {
b = Character.toString(c).getBytes("UTF-8");
} catch (Exception e) {
e.printStackTrace();
b = new byte[0];
}
for (int j = 0; j < b.length; j++) {
int k = b[j];
if (k < 0)
k += 256;
sb.append("%" + Integer.toHexString(k).toUpperCase());
}
}
}
return sb.toString();
}用这个方法不知道行不行,你看看,我一直用这个,
我读入的是ANSI字符集的文件,读这个文件用SAXReader来 read的话是报错的。只有将文件改成UTF-8字符集来读才没有错误。
我希望通过代码来自动转换解决。
我也想到了一个办法,就是在我读入ANSI字符集文件时,再转换生成一个UTF-8字符集的文件,然后再读这个文件进行解析。不过这个办法太麻烦了。
请问有没有更简便一些的办法?这个和BOM有关系的吧?
多谢了~我会加分的
是不是修改了流中的这三个,改为0xFE、0xBF、0xFF 就可以了?
SAXReader r = new SAXReader();
Document doc = r.read(new InputStreamReader(new FileInputStream(new File("yourfile")),"gbk"));
其次,如果你要转换,也要使用InputStreamReader和OutputStreamWriter,请自行查阅这两个类的javadoc
那是不是转换只能先生成一个文件,然后再读?就像我上面说的那种方法?是不是很麻烦啊?
ifile = new FileInputStream(handleFile);
document = reader.read(this.getBOMEncodingStream(ifile));protected InputStreamReader getBOMEncodingStream(InputStream is) throws IOException {
InputStream backIs = is; String sb = "";
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
while (backIs.read(bytesArry) != -1) {
arrayOutputStream.write(bytesArry);
}
arrayOutputStream.close();
bytesArry = arrayOutputStream.toByteArray();
sb = new String(bytesArry,"GBK"); InputStream tarIs = new ByteArrayInputStream(sb.getBytes("UTF-8")); return new InputStreamReader(tarIs,"UTF-8");
}
backIs.close();
return new InputStreamReader(backIs,"UTF-8");
}这是我的这段处理代码,执行了下面的函数,当执行reader.read()时,就报错了。内容如下:
An invalid XML character (Unicode: 0xbc) was found in the element content of the document. Nested exception: An invalid XML character (Unicode: 0xbc) was found in the element content of the document.
你的意思是想读文件后,要先判断是否是 utf8,不是就转, 再读,是吗?
我试过了很好用
2.然后再一行一行的以utf-8格式输出到另一文件
3.将源文件删除
'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 FunctionEnd Function
windows会尝试各种可能,并以他认为最恰当的方法来处理,如果一个文件是utf8的,却没有bom单身汉,用ansi方式来判断,会出来大量非本地字符,比如出来阿拉伯文字符,这就可能导致记事本换成utf8方式来处理。
你好,我也想过这么做。但是这样很麻烦,而且我要保持源文件的样子,不能随意改它的字符集。如果先处理成一个UTF8的文件,再对这个文件进行处理,是没有问题的。但是这样很麻烦。我想直接在内存中处理完成。
你看下这个思路怎么样, (在 windows下应该可行,但在 linux 就不清楚了,而且 ansi 文件要有 bom 标识)
先读取相应的 xml 文件, 然后通过 bom 来判断是不是 utf8,如果不是, 就按我提供的那种方式(3楼),将其转成 utf8, 保存后面的你再完成吧