原因是寫入時使用的字元編碼和期望的不一致導致的,因為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的