導航:首頁 > 編程語言 > unicodetoutf8java

unicodetoutf8java

發布時間:2023-09-23 21:59:27

java怎麼設置utf8

伺服器端
修改資料庫配置文件/etc/my.cnf
character-set-server=utf8mb4
collation_server=utf8mb4_unicode_ci
重啟MySQL(按照官方文答培檔,這兩個選項都是可以動態設置的,但是實際的經驗是Server必須重啟一下)
已有的表修改編碼為utf8mb4
ALTER TABLE
tbl_name
CONVERT TO CHARACTER SET
charset_name;
使用下面這個語句只是修改了表的default編碼
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4;
客戶端
jdbc的連接字元串不支持utf8mb4,這個 這種方式 來解決的,如果伺服器端設置了character_set_server=utf8mb4,則客戶端會自動將傳過去的utf-8視作清和唯utf8mb4。
Connector/J did not support utf8mb4 for servers 5.5.2 and newer.
Connector/J now auto-detects servers configured with character_set_server=utf8mb4 or treats the Java encoding utf-8 passed using characterEncoding=... as utf8mb4 in the SET NAMES= calls it makes when establishing the connection. (Bug #54175)
其他的client端,比如phppython需要看下client是否支持,如果不能在連接字元串中指定的話,可以在獲取連接之後,執行」set names utf8mb4″來解決這個問題;
因為utf8mb4是utf8的超集,理論上即使client修改字元集為utf8mb4,也會不棚滑會對已有的utf8編碼讀取產生任何問題。

Ⅱ java如何判斷編碼是否是utf8編碼

UTF-8編碼規范及如何判斷文本是UTF-8編碼的
UTF-8的編碼規則很簡單,只有二條:
1)對於單位元組的符號,位元組的第一位設為0,後面7位為這個符號的unicode碼。因此對於英語字母,UTF-8編碼和ASCII碼是相同的。
2)對於n位元組的符號(n>1),第一個位元組的前n位都設為1,第n+1位設為0,後面位元組的前兩位一律設為10。剩下的沒有提及的二進制位,全部為這個飢銷符號的unicode碼。
根據以上說明下面給出一段java代碼判斷UTF-8格式
/**
*UTF-8編碼格式判斷
*
*@paramrawtext
*需要分析的數據
*@return是否為UTF-8編碼格式
*/
publicstaticbooleanisUTF8(byte[]rawtext){
intscore=0;
inti,rawtextlen=0;
intgoodbytes=0,asciibytes=0;
神肢鉛//MaybealsouseUTF8ByteOrderMark:EFBBBF
//
rawtextlen=rawtext.length;
for(i=0;i<rawtextlen;i++){
if((rawtext[i]&(byte)0x7F)==rawtext[i]){
//最高位是0的ASCII字元
asciibytes++;
//IgnoreASCII,canthrowoffcount
}elseif(-64<=rawtext[i]&&rawtext[i]<=-33
游好//-0x40~-0x21
&&//Twobytes
i+1<rawtextlen&&-128<=rawtext[i+1]
&&rawtext[i+1]<=-65){
goodbytes+=2;
i++;
}elseif(-32<=rawtext[i]
&&rawtext[i]<=-17
&&//Threebytes
i+2<rawtextlen&&-128<=rawtext[i+1]
&&rawtext[i+1]<=-65&&-128<=rawtext[i+2]
&&rawtext[i+2]<=-65){
goodbytes+=3;
i+=2;
}
}
if(asciibytes==rawtextlen){
returnfalse;
}
score=100*goodbytes/(rawtextlen-asciibytes);
//Ifnotabove98,
//Allowsforsome(few)badformedsequences
if(score>98){
returntrue;
}elseif(score>95&&goodbytes>30){
returntrue;
}else{
returnfalse;
}

另外對於正規的文本文件來說UTF-8的文件開頭有3個位元組來標識該文本是UTF-8編碼
EF,BB,BF三個位元組
但通常不採用以下這種方案因為許多文件不標准
(byte[]b)
{
if(b!=null&&b.length>3)
{
byteutf8[]={(byte)0xEF,(byte)0xBB,(byte)0xBF};
if((b[0]==utf8[0])&&(b[1]==utf8[1])&&(b[2]==utf8[2]))
returntrue;
}
returnfalse;
}

Ⅲ 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中GBK編碼格式轉成UTF8,用一段方法實現怎麼做

首先明確幾點:
unicode是一種「編碼」,所謂編碼就是一個編號(數字)到字元的一種映射關系,就僅僅是一種一對一的映射而已,可以理解成一個很大的對應表格
GBK、UTF-8是一種「編碼格式」,是用來序列化或存儲1中提到的那個「編號(數字)」的一種「格式」;GBK和UTF-8都是用來序列化或存儲unicode編碼的數據的,但是分別是2種不同的格式; 他們倆除了格式不一樣之外,他們所關心的unicode編碼范圍也不一樣,utf-8考慮了很多種不同國家的字元,涵蓋整個unicode碼表,所以其存儲一個字元的編碼的時候,使用的位元組長度也從1位元組到4位元組不等;而GBK只考慮中文——在unicode中的一小部分——的字元,的編碼,所以它算好了只要2個位元組就能涵蓋到絕大多數常用中文(2個位元組能表示6w多種字元),所以它存儲一個字元的時候,所用的位元組長度是固定的;
上述2個概念不懂的請馬上google,下面不再贅述;我下面說說這個問題本身...的問題在哪裡
首先java的string使用的編碼是unicode,但是,當string存在於內存中時(也就是當程序運行時、你在代碼中用string類型的引用對它進行操作時、也就是string沒有被存在文件中且也沒有在網路中傳輸(序列化)時),是「只有編碼而沒有編碼格式的」,所以java程序中的任何String對象,說它是gbk還是utf-8都是錯的,gbk和utf-8是編碼格式而不是編碼,String在內存中不需要「編碼格式」(記住編碼格式是在存文件或序列化的時候使用的), 它只是一個unicode的字元串而已
所以java裡面String是不帶編碼格式的,而String.toByteArray(charsetName)得到的byteArray是帶編碼格式的,格式就是你傳入的'charsetName',我們不妨把toByteArray的這個過程叫做「編碼」;另外,new String(byte[], charsetName)是把一個byte數組(帶編碼格式)以charsetName指定的編碼格式翻譯為一個不帶編碼格式的String對象,我們不妨把這個過程叫「解碼」
那麼根據我揣測提問者的意圖,可能有2種問法是他真正想問的:
第一,如何把一個被錯誤地當作是gbk格式存儲的utf-8格式的文件裡面讀出來的一段亂碼字元串還原回去(也就是說本來二進制數據是utf-8的,你用gbk來解碼它,得到的字元串是亂碼,現在想要還原回去)
第二種,如何把一個gbk文件轉化為utf-8文件
如果是第一種意圖那就:
public static void main(String... args) throws Throwable {
String errStr = "errStr";
System.out.println(recover(errStr));
}

public static String recover(String str) throws Throwable {
return new String(str.getBytes("GBK"), "UTF-8");
}
其中errStr就是亂碼字元串,按照相反的順序在編碼(用gbk)、解碼(用utf-8)回去,就能得到正確的字元串(其實不保證所有情況均能正確還原,只能說大部分都能,要看你在亂碼過程中是否有數據被丟失)

如果是第二種意圖,那就用InputStream以gbk格式將文件讀到內存里(表示為String),再將這個String以UTF-8編碼寫入目標文件里,具體請參考InputStream/OutputStream的api

Ⅳ java轉碼問題

呵呵,看我這個,是本人原創。不管你是任何編碼都可以解決,唯一的缺點是效率稍微低了點(不過比樓上那個要快)。

思路:
1.首先在jsp頁面即客戶端用JavaScript將漢字處理成asc碼
2.服務端再將asc碼還原成原有的字元

JavaScript轉換代碼:

var s=document.getElementById("text").value;
var t="";
//將漢字轉換成ASCII碼,然後在伺服器端里再根據ASCII碼轉換成相應的字元
for(i=0;i<s.length;i++){
t+=s.charCodeAt(i)+" ";//將字元轉換成相應的ASCII碼並用空格隔開;
}

java服務端還原:

String param=request.getParameter("param");
StringBuffer buf=new StringBuffer("");
String[] ss = param.split(" ");
for (int i = 0; i < ss.length; i++) {
char c = (char) Integer.parseInt(ss[i].trim());
buf.append(c);
}
System.out.println("還原後的字元是:"+buf.toString());

----------------------
如果你再把轉換後的asc碼再加個數字或者減個數字就是一個簡單的加密,O(∩_∩)O~,希望對你有所幫助

Ⅵ java 中的五角星轉換成unicode碼

(Stringstr){
char[]myBuffer=str.toCharArray();

StringBuffersb=newStringBuffer();
轎激for(inti=0;i<str.length();i++){
UnicodeBlockub=梁帆賀UnicodeBlock.of(myBuffer[i]);
if(ub==UnicodeBlock.BASIC_LATIN){
//英文及數字等
sb.append(myBuffer[i]);
}elseif(ub==UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS){
//全形半形字元
intj=(int)myBuffer[i]-65248;
sb.append((char)j);
}else{
橡派//漢字
shorts=(short)myBuffer[i];
StringhexS=Integer.toHexString(s);
Stringunicode="\"+'u'+hexS;
sb.append(unicode.toLowerCase());
}
}
returnsb.toString();
}

閱讀全文

與unicodetoutf8java相關的資料

熱點內容
思科伺服器如何發布www任務 瀏覽:680
怎麼在蘋果裡面下王者安卓版的 瀏覽:686
c語言改編程序沒保存 瀏覽:437
msdos編譯教程 瀏覽:978
怎麼去文件夾後綴 瀏覽:445
粉筆app筆試真題在哪裡 瀏覽:108
晉江小說閱讀app怎麼注冊填寫驗證 瀏覽:157
安卓手機如何將手機app安裝到u盤 瀏覽:520
指針編譯在哪運行 瀏覽:810
dnf大槍壓縮補丁 瀏覽:355
linux命令env 瀏覽:914
浙江app遙控鎖哪裡有 瀏覽:708
qq別人加密了怎樣才能給他解開 瀏覽:253
程序員離職開店 瀏覽:770
excel不能對多重區域使用此命令 瀏覽:969
手機影像演算法盤點 瀏覽:729
反編譯為什麼不能得到源代碼 瀏覽:926
php最流行的框架 瀏覽:191
cnc編程哪種軟體好 瀏覽:1004
電腦編程軟體報班學習 瀏覽:507