原因是写入时使用的字符编码和期望的不一致导致的,因为JVM虚拟机启动内时会因不同的参数使用容不同的缺省字符编码。
解决办法:
如果你期望写到文件中的汉字是 GBK编码,可以:
1、写文件时,将字符串准换成 GBK编码的byte[], 如: myios.write( "汉字".getBytes("GBK"));
2、java 虚拟机启动时,增加 -DFile.encode=GBK 选项。
❷ java判断文件编码格式 怎么判断编码格式
UTF-8编码的文本文档,有的带有BOM (Byte Order Mark, 字节序标志),即0xEF, 0xBB, 0xBF,有的没有。Windows下的txt文本编辑器在保存UTF-8格式的文本文档时会自动添加BOM到文件头。在判断这类文档时,可以根据文档的前3个字节来进行判断。然而BOM不是必需的,而且也不是推荐的。对不希望UTF-8文档带有BOM的程序会带来兼容性问题,例如Java编译器在编译带有BOM的UTF-8源文件时就会出错。而且BOM去掉了UTF-8一个期望的特性,即是在文本全部是ASCII字符时UTF-8是和ASCII一致的,即UTF-8向下兼容ASCII。
在具体判断时,如果文档不带有BOM,就无法根据BOM做出判断,而且IsTextUnicode API也无法对UTF-8编码的Unicode字符串做出判断。那在编程判断时就要根据UTF-8字符编码的规律进行判断了。
UTF-8是一种多字节编码的字符集,表示一个Unicode字符时,它可以是1个至多个字节,在表示上有规律:
1字节:0xxxxxxx
2字节:110xxxxx 10xxxxxx
3字节:1110xxxx 10xxxxxx 10xxxxxx
4字节:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
这样就可以根据上面的特征对字符串进行遍历来判断一个字符串是不是UTF-8编码了。
举例代码:
java.io.File f=new java.io.File("待判定的文本文件名");
try{
java.io.InputStream ios=new java.io.FileInputStream(f);
byte[] b=new byte[3];
ios.read(b);
ios.close();
if(b[0]==-17&&b[1]==-69&&b[2]==-65)
System.out.println(f.getName()+"编码为UTF-8");
else System.out.println(f.getName()+"可能是GBK");
}catch(Exception e){
e.printStackTrace();
}
❸ java怎样设置txt文件的编码格式
可以使用流来修改!百
如:
String path ="C......"
File file = new File(path);
Writer outTxt = new OutputStreamWriter(new FileOutputStream(file,true), "UTF-8");
outTxt.write("文件内度容格式不正知确, 此文件已被系统删除专!道 ");
outTxt.close();注意:记版属事本只支持ANSI、权Unicode、Unicode
big
endian、UTF-8四种编码格式。
❹ 收藏java 如何判断txt的编码字符集
简单判断是UTF-8或不是UTF-8,因为一般除了UTF-8之外就是GBK,所以就设置默认为GBK。
按照给定的字符集存储文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理就是只要读出文件前三个字节,判定这些字节的值,就可以得知其编码的格式。其实,如果项目运行的平台就是中文操作系统,如果这些文本文件在项目内产生,即开发人员可以控制文本的编码格式,只要判定两种常见的编码就可以了:GBK和UTF-8。由于中文Windows默认的编码是GBK,所以一般只要判定UTF-8编码格式。
对于UTF-8编码格式的文本文件,其前3个字节的值就是-17、-69、-65,所以,判定是否是UTF-8编码格式的代码片段如下:
[java] view plain
File file = new File(path);
InputStream in= new java.io.FileInputStream(file);
byte[] b = new byte[3];
in.read(b);
in.close();
if (b[0] == -17 && b[1] == -69 && b[2] == -65)
System.out.println(file.getName() + ":编码为UTF-8");
else
System.out.println(file.getName() + ":可能是GBK,也可能是其他编码");
2:若想实现更复杂的文件编码检测,可以使用一个开源项目cpdetector,它所在的网址是:http://cpdetector.sourceforge.net/。它的类库很小,只有500K左右,cpDetector是基于统计学原理的,不保证完全正确,利用该类库判定文本文件的代码如下:
读外部文件(先利用cpdetector检测文件的编码格式,然后用检测到的编码方式去读文件):
[java] view plain
/**
* 利用第三方开源包cpdetector获取文件编码格式
*
* @param path
* 要判断文件编码格式的源文件的路径
* @author huanglei
* @version 2012-7-12 14:05
*/
public static String getFileEncode(String path) {
/*
* detector是探测器,它把探测任务交给具体的探测实现类的实例完成。
* cpDetector内置了一些常用的探测实现类,这些探测实现类的实例可以通过add方法 加进来,如ParsingDetector、
* JChardetFacade、ASCIIDetector、UnicodeDetector。
* detector按照“谁最先返回非空的探测结果,就以该结果为准”的原则返回探测到的
* 字符集编码。使用需要用到三个第三方JAR包:antlr.jar、chardet.jar和cpdetector.jar
* cpDetector是基于统计学原理的,不保证完全正确。
*/
CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();
/*
* ParsingDetector可用于检查HTML、XML等文件或字符流的编码,构造方法中的参数用于
* 指示是否显示探测过程的详细信息,为false不显示。
*/
detector.add(new ParsingDetector(false));
/*
❺ java怎样设置txt文件的编码格式
可以使用流来抄修改!
如:
Stringpath="C......"
Filefile=newFile(path);
WriteroutTxt=newOutputStreamWriter(newFileOutputStream(file,true),"UTF-8");
outTxt.write("文件内容格式不正确,此文件已被系统删除!");
outTxt.close();
注意:记事本只支持ANSI、Unicode、Unicode big endian、UTF-8四种编码格式。
❻ TXT文件编码为ANSI,怎么实现用JAVA程序转换为Uncoide
package test;
import java.io.UnsupportedEncodingException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class CodeUtil { public static void main(String[] args) throws UnsupportedEncodingException {
String chinaString = "测试";
String unicode = convertToUnicode(chinaString);
System.out.println(unicode);
System.out.println(unicodeToChinese(unicode));
String _x16 = convertTo16Code(chinaString, "UTF-8").toLowerCase();
System.out.println(_x16);
String[] sby = convertToBitCode(_x16);
StringBuffer subf = new StringBuffer();
subf.append("byte[] bytes = {");
byte[] bytes = new byte[sby.length];
for (int i = 0; i < sby.length; i++) {
int icode = Integer.decode(sby[i]).intValue();
bytes[i] = (byte) icode;
subf.append("(byte)").append(sby[i]).append(",");
// System.out.println(sby[i]);
}
subf.deleteCharAt(subf.length() - 1);
subf.append("};");
System.out.println(subf.toString());
System.out.println(new String(bytes, "UTF-8"));
}
private final static String hexString = "0123456789ABCDEF";
/**
* 转16进制,如果是中文,encoding-->>UTF-8
*/
public static String convertTo16Code(String str, String encoding)
throws UnsupportedEncodingException {
byte[] bytes = str.getBytes(encoding);
StringBuffer sb = new StringBuffer(bytes.length * 2);
for (int i = 0; i < bytes.length; i++) {
sb.append(hexString.charAt((bytes[i] & 0xf0) >> 4));
sb.append(hexString.charAt((bytes[i] & 0x0f) >> 0));
}
return sb.toString();
}
/**
* 将汉字转Unicode
*
* @param String
* s
* @return String sb.toString();
*/
public static String convertToUnicode(String s) {
if (s == null) {
return s;
}
char[] chars = s.toCharArray();
char c;
StringBuffer sb = new StringBuffer();
for (int i = 0; i < chars.length; i++) {
c = chars[i];
if (c > 0xff) {
sb.append("\\u").append(Integer.toHexString(c));
} else {
sb.append(c);
}
}
return sb.toString();
}
/**
* 将16进制转为区位码
*
* @param
*/
public static String[] convertToBitCode(String str_16) {
String[] result = null;
if (str_16 == null || str_16 == "" || str_16.length() % 2 != 0) {
return result;
}
result = new String[str_16.length() / 2];
for (int i = 0; i < str_16.length() / 2; i++) {
result[i] = "0x" + str_16.charAt(i * 2) + str_16.charAt(i * 2 + 1);
}
return result;
}
/**
*
*/
public static String unicodeToChinese(String unicodeStr) {
int start = 0;
int end = 0;
final StringBuffer buffer = new StringBuffer();
while (start > -1) {
end = unicodeStr.indexOf("\\u", start + 2);
String charStr = "";
if (end == -1) {
charStr = unicodeStr.substring(start + 2, unicodeStr.length());
} else {
charStr = unicodeStr.substring(start + 2, end);
}
char letter = (char) Integer.parseInt(charStr, 16);
buffer.append(new Character(letter).toString());
start = end;
}
return buffer.toString();
}
public static boolean isChinese(char c) {
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
return true;
}
return false;
}
public static boolean isMessyCode(String str) {
Pattern p = Pattern.compile("\\s*|\t*|\r*|\n*");
Matcher m = p.matcher(str);
String after = m.replaceAll("");
String temp = after.replaceAll("\\p{P}", "");
char[] ch = temp.trim().toCharArray();
float chLength = ch.length;
float count = 0;
for (int i = 0; i < ch.length; i++) {
char c = ch[i];
if (!Character.isLetterOrDigit(c)) {
if (!isChinese(c)) {
count = count + 1;
System.out.print(c);
}
}
}
float result = count / chLength;
if (result > 0.4) {
return true;
} else {
return false;
}
}
}
这个你懂了,解决你的问题就是小意思了
❼ java写入txt时按指定编码写入
过去的所谓"unicode编码"其实是指ucs-16编码,unicode是指字符集,连gb18030都是unicode编码。而“unicode
big
endian
”是utf-16be编码,也属于unicode编码.
可以改成
outputstreamwriter
out
=
new
outputstreamwriter(new
fileoutputstream(file,true),"utf-16le");//应该就是你要的不严谨的"unicode"编码
❽ java写入txt时按指定编码写入
是的需要指定的一般都是utf_8和gbk的