drop table test;
create table test
(
name varchar(1)
) engine=myisam default charset=utf8mb4;
insert into test values('嚴');
commit;
然后執行如下SQL,發現“嚴”占了3個位元組
mysql> select name,length(name) from test;
+------+--------------+
| name | length(name) |
+------+--------------+
| 嚴 | 3 |
+------+--------------+
這說明這個漢字保存成了UTF-8編碼
現在我
static HashMap<String,String> h_test = new HashMap<String,String>();
String str=rs.getString("name");
h_test.put(str,"");
請問str里和h_test里的“嚴”是UTF-8編碼的碼?
如何知道str的位元組數?
謝謝
uj5u.com熱心網友回復:
和你運行程式的系統的編碼環境有關,例如我臺機的編碼格式是gbk, 所以就是2位元組,但是mac 是utf-8 結果就是3位元組System.out.println(cc.getBytes().length);
System.out.println(Charset.defaultCharset());
uj5u.com熱心網友回復:
謝謝大神
感覺很復雜
1. 編譯時的encoding是啥意思?
javac -encoding GBK me.java
2.運行時的-Dfile.encoding是啥意思?
java -Dfile.encoding=utf-8 me
3. 連資料庫時的characterEncoding啥意思?
characterEncoding=UTF-8
好復雜啊!如上3個encoding有什么區別,分別起到什么作用?
謝謝
我覺得編碼無非就是:
1. 以什么編碼規則寫入
2. 以什么編碼規則讀取
3. 以什么編碼規則展示
我就是想實作:
1. 保存在資料庫表里的字符是UTF-8的,也可能是GBK的
不管是UTF-8還是GBK,
然后查詢資料庫表,將表資料都以UTF-8編碼保存到String或者hashmap,
2. 保存在檔案里的字符是UTF-8的,也可能是GBK的
不管是UTF-8還是GBK,
然后讀取檔案,將檔案資料都以UTF-8編碼保存到String或者hashmap,
請教如何實作?謝謝
uj5u.com熱心網友回復:
Java 記憶體中的字符都是 雙位元組資料,采用的是 Unicode 編碼,Unicode16 雙位元組編碼。然后,在談談其他相關的編碼。
比如:Java 源檔案的編碼,一般使用的是 UTF-8 編碼,也有用 GBK 編碼的,這沒有什么問題,因為,Java 源檔案要進行編譯的,編譯程序會對字串進行編碼轉換,最后,編譯完成會生成 class 檔案,位元組碼檔案中的字串是統一使用 UTF-8 編碼。所以,很多人在撰寫 Java 源檔案的時候,直接讓源檔案也保存成 UTF-8 編碼,省得編譯器進行編碼轉換了。
資料庫中的字串也存在編碼方式的問題,我們要具體分析一下,這個涉及編碼的地方比較多。
1. 記憶體當中,資料處理時的字符編碼,一般使用 Unicode 編碼,以為它是定長編碼,處理起來比較方便;
2. 資料檔案(硬碟檔案)中的字符編碼(建表的時候可以設定),一般使用 UTF-8 / GBK 等本地語言對應的編碼(要存盤多國語言的使用UTF-8);
3. 資料傳輸時的字符編碼,就是 JDBC 連接資料庫后,你查詢結果中有字串,然后,從服務器傳輸到你的應用程式時使用的編碼,一般也使用 UTF-8 編碼。
樓主查看的編碼,應該是資料表中存盤字符采用的編碼。
Unicode 和 UTF-8 編碼,都可以編碼多國語言的字符,一個是定長編碼,一個是變長編碼,使用在不同的場景當中。
定長編碼方便資料的處理,可以很快找到字串中的某個位置的字符;
變長編碼方便資料的傳輸和存盤,雖然,漢字要多占一些空間,但是,可以支持多國語言并且英文很省空間。
如果你建的表中的字串只有中文,可以在建表的時候設定編碼為 GBK/GB2312 即可。
uj5u.com熱心網友回復:
樓主那個 HashMap 里面的字串,編碼都是 Uncode 的編碼,你在寫入檔案的時候,進行轉碼即可。
兩種方式:
1. 構建 FileWriter 物件時,設定檔案的編碼方式是 UTF-8 ,然后,寫入字串即可自動完成編碼轉換。
2. 構建 FileOutputSteam 寫入二進制資料流,即 byte 陣列,使用 String.getBytes(“UTF-8”) 方法,得到 UTF-8 編碼的二進制資料,寫入輸出流當中。
uj5u.com熱心網友回復:
謝謝大神指點
我想一個問題一個問題整理清楚
1.首先編譯的時候,-encoding是針對.java檔案的編碼說明
如下,說明test.java的編碼是GBK
javac -encoding GBK test.java
如下,說明test.java的編碼是UTF-8
javac -encoding UTF-8 test.java
如果-encoding和test.java的編碼不匹配,就有可能編譯報錯
2.如上原始碼不管是GBK編碼的,還是UTF-8編碼的,只要能編譯成功
WINDOWS和Linux平臺都能使用,原始碼本身是什么編碼并不重要,對吧?
3.我有一個mysql資料里,有一張表,表資料編碼是UTF-8 (UTF8MB4)
也就是漢字是3個位元組的。
現在我連接資料庫,查詢這個表,
然后將表的記錄欄位值保存到String,或者hashmap里
假設select name from t limit 1 name的值是“好”
首先,如下characterEncoding=UTF-8和characterEncoding=GBK是起到什么作用?
DBURL="jdbc:mysql://localhost:3306/"+dbname+"?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8";
DBURL="jdbc:mysql://localhost:3306/"+dbname+"?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=GBK";
其次,由于表的資料是UTF-8的,那么
從資料庫服務器傳輸到java變數,這個傳輸的程序是什么編碼?
最后,將“好”保存到String str=rs.getString("name")
此時在str里的“好”是什么編碼,假設是UTF-16,
那么是java自動將資料庫的UTF-8自動轉成str的UTF-16了嗎?
謝謝大神
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/283925.html
標籤:Java SE
