導航:首頁 > 編程語言 > java取字元串編碼

java取字元串編碼

發布時間:2023-09-05 08:49:02

java如何把string轉為utf-8

java不同編碼之間進行轉換,都需要使用unicode作為中轉。

String str = "任意字元串";

str = new String(str.getBytes("gbk"),"utf-8");

備注說明:

str.getBytes("UTF-8"); 意思是以UTF-8的編碼取得位元組

new String(XXX,"UTF-8"); 意思是以UTF-8的編碼生成字元串飢沖

舉例:

public static String getUTF8XMLString(String xml) {

// A StringBuffer Object

StringBuffer sb = new StringBuffer();

sb.append(xml);

String xmString = "";

String xmlUTF8="";

try {

xmString = new String(sb.toString().getBytes("UTF-8"));

xmlUTF8 = URLEncoder.encode(xmString, "UTF-8");

System.out.println("utf-8 編碼:" + xmlUTF8) ;

} catch (UnsupportedEncodingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

// return to String Formed

return xmlUTF8;

(1)java取字元串編碼擴展閱讀:

UTF-8編碼規則:

如果只有一個位元組則其最高二進制位為0;如果是多位元組,其第一個位元組從最高位開始,連續的二進制位值為1的個數決定了其編碼茄肢頌的位元組數,其餘各位元組均以10開頭。

實際表示ASCII字元的UNICODE字元,將會編碼成1個位元組,並且UTF-8表示與ASCII字元表示是一樣的。所有其他的UNICODE字元轉化成UTF-8將需要至少2個位元組。每個位元組由一個換碼序列開始。第一個位元組由唯一的換碼序列,由n位連續的1加一位0組成,首位元組連續的1的個數表示字元編碼所需的位元組數。

Unicode轉換為UTF-8時,可以將Unicode二進制從低位往高位取出二進制數字,每次取6位,如上顫鄭述的二進制就可以分別取出為如下示例所示的格式,前面按格式填補,不足8位用0填補。

② java中怎麼判斷一個字元串的編碼

明確告訴你,沒有辦法,你必須先知道編碼,才能把byte數組轉成字元,如果已經是java的String那麼只有unicode編碼一種。

③ 怎麼用java把一個字元串進行utf8編碼

String text = 「字元串」;

byte[] b_utf8 = text.getBytes("UTF-8"); //utf-8

byte[] b_iso88591 = text.getBytes("ISO8859-1"); //iso8859-1

byte[] b_gbk = text.getBytes("GBK"); //gbk

string unicode = getUnicode(text);//unicode

public static String getUnicode(String source) {

String result = "";

for (int i = 0; i < source.length(); i++) {

result += "\u"+Integer.toHexString((int) source.charAt(i));

}

return result;

}

④ 怎麼讀取java文件中字元編碼格式

1:簡單判斷是UTF-8或不是UTF-8,因為一般除了UTF-8之外就是GBK,所以就設置默認為GBK。
按照給定的字元集存儲文件時,在文件的最開頭的三個位元組中就有可能存儲著編碼信息,所以,基本的原理就是只要讀出文件前三個位元組,判定這些位元組的值,就可以得知其編碼的格式。其實,如果項目運行的平台就是中文操作系統,如果這些文本文件在項目內產生,即開發人員可以控制文本的編碼格式,只要判定兩種常見的編碼就可以了:GBK和UTF-8。由於中文Windows默認的編碼是GBK,所以一般只要判定UTF-8編碼格式。
對於UTF-8編碼格式的文本文件,其前3個位元組的值就是-17、-69、-65,所以,判定是否是UTF-8編碼格式的代碼片段如下:
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檢測文件的編碼格式,然後用檢測到的編碼方式去讀文件):
/**
* 利用第三方開源包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));
/*
* JChardetFacade封裝了由Mozilla組織提供的JChardet,它可以完成大多數文件的編碼
* 測定。所以,一般有了這個探測器就可滿足大多數項目的要求,如果你還不放心,可以
* 再多加幾個探測器,比如下面的ASCIIDetector、UnicodeDetector等。
*/
detector.add(JChardetFacade.getInstance());// 用到antlr.jar、chardet.jar
// ASCIIDetector用於ASCII編碼測定
detector.add(ASCIIDetector.getInstance());
// UnicodeDetector用於Unicode家族編碼的測定
detector.add(UnicodeDetector.getInstance());
java.nio.charset.Charset charset = null;
File f = new File(path);
try {
charset = detector.detectCodepage(f.toURI().toURL());
} catch (Exception ex) {
ex.printStackTrace();
}
if (charset != null)
return charset.name();
else
return null;
}
String charsetName = getFileEncode(configFilePath);
System.out.println(charsetName);
inputStream = new FileInputStream(configFile);
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, charsetName));
讀jar包內部資源文件(先利用cpdetector檢測jar內部的資源文件的編碼格式,然後以檢測到的編碼方式去讀文件):
/**
* 利用第三方開源包cpdetector獲取URL對應的文件編碼
*
* @param path
* 要判斷文件編碼格式的源文件的URL
* @author huanglei
* @version 2012-7-12 14:05
*/
public static String getFileEncode(URL url) {
/*
* 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));
/*
* JChardetFacade封裝了由Mozilla組織提供的JChardet,它可以完成大多數文件的編碼
* 測定。所以,一般有了這個探測器就可滿足大多數項目的要求,如果你還不放心,可以
* 再多加幾個探測器,比如下面的ASCIIDetector、UnicodeDetector等。
*/
detector.add(JChardetFacade.getInstance());// 用到antlr.jar、chardet.jar
// ASCIIDetector用於ASCII編碼測定
detector.add(ASCIIDetector.getInstance());
// UnicodeDetector用於Unicode家族編碼的測定
detector.add(UnicodeDetector.getInstance());
java.nio.charset.Charset charset = null;
try {
charset = detector.detectCodepage(url);
} catch (Exception ex) {
ex.printStackTrace();
}
if (charset != null)
return charset.name();
else
return null;
}
URL url = CreateStationTreeModel.class.getResource("/resource/" + "配置文件");
URLConnection urlConnection = url.openConnection();
inputStream=urlConnection.getInputStream();
String charsetName = getFileEncode(url);
System.out.println(charsetName);
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, charsetName));
3:探測任意輸入的文本流的編碼,方法是調用其重載形式:
charset=detector.detectCodepage(待測的文本輸入流,測量該流所需的讀入位元組數);
上面的位元組數由程序員指定,位元組數越多,判定越准確,當然時間也花得越長。要注意,位元組數的指定不能超過文本流的最大長度。
4:判定文件編碼的具體應用舉例:
屬性文件(.properties)是Java程序中的常用文本存儲方式,象STRUTS框架就是利用屬性文件存儲程序中的字元串資源。它的內容如下所示:
#注釋語句
屬性名=屬性值
讀入屬性文件的一般方法是:
FileInputStream ios=new FileInputStream(「屬性文件名」);
Properties prop=new Properties();
prop.load(ios);
String value=prop.getProperty(「屬性名」);
ios.close();
利用java.io.Properties的load方法讀入屬性文件雖然方便,但如果屬性文件中有中文,在讀入之後就會發現出現亂碼現象。發生這個原因是load方法使用位元組流讀入文本,在讀入後需要將位元組流編碼成為字元串,而它使用的編碼是「iso-8859-1」,這個字元集是ASCII碼字元集,不支持中文編碼,
方法一:使用顯式的轉碼:
String value=prop.getProperty(「屬性名」);
String encValue=new String(value.getBytes(「iso-8859-1″),」屬性文件的實際編碼」);
方法二:象這種屬性文件是項目內部的,我們可以控制屬性文件的編碼格式,比如約定採用Windows內定的GBK,就直接利用」gbk」來轉碼, 如果約定採用UTF-8,就使用」UTF-8″直接轉碼。
方法三:如果想靈活一些,做到自動探測編碼,就可利用上面介紹的方法測定屬性文件的編碼,從而方便開發人員的工作
補充:可以用下面代碼獲得Java支持編碼集合:
Charset.availableCharsets().keySet();
可以用下面的代碼獲得系統默認編碼:
Charset.defaultCharset();

⑤ java 中如何查看字元串的編碼類型

可以通過以下方法來進行編碼格式判斷,輸入一個字元串,之後返回字元串編碼類型。
public static String getEncoding(String str) {
String encode = "GB2312";
try {
if (str.equals(new String(str.getBytes(encode), encode))) { //判斷是不是GB2312
String s = encode;
return s; //是的話,返回「GB2312「,以下代碼同理
}
} catch (Exception exception) {
}
encode = "ISO-8859-1";
try {
if (str.equals(new String(str.getBytes(encode), encode))) { //判斷是不是ISO-8859-1
String s1 = encode;
return s1;
}
} catch (Exception exception1) {
}
encode = "UTF-8";
try {
if (str.equals(new String(str.getBytes(encode), encode))) { //判斷是不是UTF-8
String s2 = encode;
return s2;
}
} catch (Exception exception2) {
}
encode = "GBK";
try {
if (str.equals(new String(str.getBytes(encode), encode))) { //判斷是不是GBK
String s3 = encode;
return s3;
}
} catch (Exception exception3) {
}
return ""; //如果都不是,說明輸入的內容不屬於常見的編碼格式。

⑥ JAVA字元串編碼問題!

這種編碼問題真是很tricky的問題。說它tricky是因為這至少涉及到以下4種編碼選取的排列組合(有時甚至更多),更有時乃至會發生錯進錯出,負負得正,中間過程錯了但反而到不是亂碼的情況。

(1)源代碼的編碼
(2)編譯時告訴java編譯器的源代碼編碼
(3)運行時jvm參數file.encoding
(4)輸出終端對輸出位元組流的解碼所採用的碼組

在這簡單情況下(1)和(2)一致,(3)和(4)一致就不會因為編解碼映射錯誤(當然字元向終端字體映射的錯誤是另一回事,如字體缺失之類)。而(1)(2)和(3)(4)不必一致,這樣就使得不必強求開發編譯環境和運行應用環境的編碼必須一致。

源代碼的錄入與編譯若在在一個平台上時,大多數情況沒有問題(反而用聰明的Idea IDE設置錯誤時會亂套,越是簡陋的開發環境越不太會錯)。但是如果你在中文GBK編碼平台上的源代碼在別人的unicode編碼平台上編譯,就有問題了。所以和別人,特別是和不同母語的人合作編程時,建議要麼約定一律用unicode作為源文件編碼;要麼只用ASCII字元,反正其他編碼一般都和ASCII兼容的,對於非ASCII字元,用Java的/uxxxx表示機制,比如"中國"就表示為"\u4e2d\u56fd"。4e2d和56fd分別是中國二字的unicode十六進制編碼。

但我認為樓主在這里其實主要關心的是運行時的編碼一致問題,即(3)和(4)。所以言歸正傳,讓我們來檢查它們是否一致。

由於正如上述,iso8859-1編碼集其實是被其他所有公認的編碼集所兼容的,也就是說它是所有公認編碼集的公共子集。所以以iso8859-1為基礎可以外延到任何一個公認編碼集。事實上大多數情況也是這樣做的。比如java System property里設定了encoding為iso8859-1,事實上不僅僅是一個Latin字母的映射,在非Latin區域按JVM宿主操作系統的編碼擴展。即選iso8859-1其實是選擇了宿主操作系統的默認編碼。

假設樓主的操作系統編碼是GBK,那麼file.encoding=iso8859-1相當於選擇了file.encoding=GBK。那麼System.out.println(...)這個核心類方法會將china字元轉換為file.encoding指定的編碼(GBK)位元組由out流輸出給最終out所綁定的終端。比如console一般採用系統默認編碼也是GBK的話,那就和file.encoding一致,能正常解碼,不會亂碼。

至於System.out.write()直接寫位元組流。由於該位元組流是由china.getBytes()得到的,在不指定編碼的時候使用file.encoding指定的默認值的(即GBK),因此Str->Byte的編碼方法GBK和console採用的解碼方法GBK又是一致的,所以也不是亂碼。

但是這時候用toHexString列印出的兩個位元組串是不一樣的。先直接把china逐字強行轉換為int的情況,不涉及輸出編碼,總是unicode的。(JVM規范規定class里字串必須unicode編碼)只要上述(1) (2)匹配,java編譯器會自動從各種編碼的源文件正確轉成class文件里統一unicode編碼的字串。相反,作為一個題外話提一下,當(1)(2)不匹配時會在特定的一種配合(1)(2)的(3)(4)也不匹配的情況下會負負得正輸出正常,但這是絕對錯誤的做法,因為任何要求(1)(2)和(3)(4)有匹配關系的要求都是在應用中可能無法滿足的。java編譯器對這種情況也會報告warning,但不fail。

綜上,一旦file.encoding設成宿主操作系統默認而系統consle也採用操作系統默認編解碼的話,(3)(4)總是一致的,無論系統選擇的是GBK還是utf-8等等。

那麼如果file.encoding不選系統默認呢?比如utf-8。那就很可能出現亂碼了。但是,慢著,試驗的結果還是沒有亂碼。那是因為file.encoding是靜態的JVM系統參數,在程序里像樓主那樣設定是不起作用的(我不知道有沒有辦法發一個什麼通知讓這種程序改變生效的)。必須作為JVM參數直接傳給java程序讓它構造虛擬機的時候就得到這個參數,否則JVM會去拿宿主系統的默認值,就相當於又回到設file.encoding=iso8859-1了。
java -Dfile.encoding=utf-8 A
這下終於亂碼了,而且兩個都亂了。列印出的位元組串一個還是unicode,另一個從GBK變到utf-8了。

如果你發現試驗的現象和我上面說的正好相反,請注意檢查console的編碼設置,我們上面假設它也採用了宿主系統默認編碼,但有些console很高級的嘞,可以設置成不通編碼的(其實幾乎所有的都可以)。那麼分析的方法和上面一樣,結果可能正好相反。

⑦ Java怎麼將字元串轉換為GB2312原編碼

@Test
publicvoidtest333(){
Stringa="青白";
try{
byte[]b=a.getBytes("GB2312");
System.out.println(bytesToHexFun1(b));

}catch(UnsupportedEncodingExceptione){
e.printStackTrace();
}
}
//將byte數組轉成16進制字元串
(byte[]bytes){
char[]HEX_CHAR={'0','1','2','3','4','5',
'6','7','8','9','a','b','c','d','e','f'};
//一個byte為8位,可用兩個十六進制位標識
char[]buf=newchar[bytes.length*2];
inta=0;
intindex=0;
for(byteb:bytes){//使用除與取余進行轉換
if(b<0){
a=256+b;
}else{
a=b;
}
buf[index++]=HEX_CHAR[a/16];
buf[index++]=HEX_CHAR[a%16];
}
returnnewString(buf);
}

中心思想就是先轉成GB2312的byte數組,再轉成16進制就可以了。

⑧ java如何獲取正確的字元編碼

如果是修改文件的編碼方式,可以按以下步驟:
選中文件右鍵-->Properties-->Resource-->Text file encoding-->選中Other,然後選擇自己想要的編碼格式就可以了。
如果是修改MyEclipse的編碼方式,可以按以下步驟:
菜單欄的Window-->Perferences-->General-->Work Space-->Text file encoding-->選中Other,然後選擇自己想要的編碼格式就可以了。

閱讀全文

與java取字元串編碼相關的資料

熱點內容
大型雲伺服器有哪些 瀏覽:466
解壓版三國街機 瀏覽:423
去中心化app裡麵包含什麼 瀏覽:948
密鑰安裝命令行 瀏覽:505
文獻編譯英文 瀏覽:659
php調用瀏覽器 瀏覽:527
數控車床編程初學實例 瀏覽:949
cad中篩選命令是什麼 瀏覽:800
數控銑床法蘭克編程 瀏覽:330
怎麼樣分解壓縮包圖標 瀏覽:619
php兩年工作經驗簡歷 瀏覽:765
怎麼提前解壓房貸 瀏覽:699
反詐宣傳app哪裡可以拿到用戶資料 瀏覽:856
華為交換機命令配置 瀏覽:12
電機pid演算法實例c語言 瀏覽:974
安裝ue5未找到金屬編譯器 瀏覽:965
l1壓縮性骨折微創手術 瀏覽:617
看電腦配置命令 瀏覽:110
單片機調用db數值偏移量 瀏覽:447
賓士smart車型壓縮機功率 瀏覽:529