Hbase中文字元與byte 的轉換

2021-08-01 13:54:43 字數 1448 閱讀 5897

原文:

hbase客戶端資訊採用byte與伺服器進行通訊,中文字元與byte的轉換的轉換有兩種方式: 

1.採用string類自帶的函式 

string s  = "你好中國"; 

byte b = s.getbytes(); 

對應的byte轉換為string為: 

s = new string(s.getbytes()); 

2.採用org.apache.hadoop.hbase.util.bytes類的函式 

string s  = "你好中國"; 

byte b = bytes.tobytes(s); 

對應的byte轉換為string為: 

s = bytes.tostring(bytes.tobytes(s)); 

方法1 與方法2 都能完成自己的轉換,輸出也正常。 

但是兩種方法不能混合使用,因為兩種方法中b值卻一樣, 

方法1:b = [-60, -29, -70, -61, -42, -48, -71, -6] 

方法2:b = [-28, -67, -96, -27, -91, -67, -28, -72, -83, -27, -101, -67] 

原因在於換行的時候採用的charset不一致 

在方法2中 bytes.tobytes(s); 最後呼叫的是string類中的s.getbytes("utf-8");而不是s.getbytes()。 

s.getbytes("utf-8")與s.getbytes()最後都呼叫了的 

static byte encode(string charsetname, char ca, int off, int len) 

關鍵在於charsetname不同。 

在看s.getbytes()最後的charsetname, 

產生的函式為: 

public static charset defaultcharset()  

} return defaultcharset; 

} 跟系統引數file.encoding的值有關,檢視下本機的file.encoding 

system.out.println(system.getproperty("file.encoding")); 

值為gb18030,因此以上兩種方式產生的byte自然不同, 

因此hbase中文字元與byte的轉換要統一編碼格式,全部採用方法2最好,如果要使用string類的方法 

使用方法如下: 

string s  = "你好中國"; 

byte b = s.getbytes("utf-8"); 

對應的byte轉換為string為: 

s = new string(bytes.tobytes(s),"utf-8"); 

以上區別只針對與中文的轉換,數字與英文以及"`~!@#$%^&*()_+=-|{}\\/.,<>?"沒有區別!! 

輸出中文字元

輸出中文字元 要想在圖形中輸出中文字元,需要對輸出的中文字元進行編碼。使用iconv 函式,可以把一種編碼的字元,轉換為其他編碼的字元。下面介紹在圖形中輸出中文字元的方法,建立乙個新圖形 image imagecreate 400,200 設定背景,分配顏色 bgcolor imagecoloral...

MySQL不能插入中文字元及中文字元亂碼問題

mysql的預設編碼是latin1,不支援中文,要支援中午需要把資料庫的預設編碼修改為gbk或者utf8。在安裝後mysql之後,它的配置檔案不是很給力,不知道你們的是不是,反正我的是!開始插入中文字元的時候出現如下錯誤 error 1366 hy000 incorrect string value...

MySQL不能插入中文字元及中文字元亂碼問題

mysql的預設編碼是latin1,不支援中文,要支援中午需要把資料庫的預設編碼修改為gbk或者utf8。在安裝後mysql之後,它的配置檔案不是很給力,不知道你們的是不是,反正我的是!開始插入中文字元的時候出現如下錯誤 error 1366 hy000 incorrect string value...