① java的編碼不是UCS2么怎麼像是多位元組編碼
java的char 是以UCS2編碼來交換的,每個字元佔2個位元組。
但getBytes屬於IO了,通常默認用UTF8編碼。
在utf8下,'中國'各佔3個位元組,『23』各佔1個位元組,合起來8個。
② Java:在Java中String是以Unicode保存的嗎
字元串在java內存中總是按unicode編碼存儲的。比如"中文",正常情況下(即沒有錯誤的時候)存儲為"4e2d 6587",如果charset為"gbk",則被編碼為"d6d0 cec4",然後返回位元組"d6 d0 ce c4".如果charset為"utf8"則最後是"e4 b8 ad e6 96 87".如果是"iso8859-1",則由於無法編碼,最後返回 "3f 3f"(兩個問號)。
java虛擬機採用UCS2(通用字元集)標準保存字元,所有的字元在內存中都是2個位元組,這樣虛擬機處理字元串的截取、長度和判斷都非常容易。其他語言如PHP、Python也是,在運行時採用固定長度存儲字元。
相對應編譯後的class,java規定採用UTF-8保存,因為大部分是英文字元,只有一個位元組,可以大量節省存儲空間。
③ java 設置字元集為UCS2 運行報錯
系統沒這樣的字體,一般設置utf-8或gb2312或gbk即可
④ java認證:如何按位元組長度截取字元串
編程:編寫一個截取字元串的函數,輸入為一個字元串和位元組數,輸出為按位元組截取的字元串。public static String substring(String str, int toCount,String more){int reInt = 0;String reStr = 「」;if (str == null)return 「」;char[] tempChar = str.toCharArray();for (int kk = 0; (kk 《 tempChar.length && toCount 》 reInt); kk++) {String s1 = str.valueOf(tempChar[kk]);byte[] b = s1.getBytes();reInt += b.length;reStr += tempChar[kk];}if (toCount == reInt || (toCount == reInt - 1))reStr += more;return reStr;}Web應用程序在瀏覽器中顯示字元串時,由於顯示長度的限制,常常需要將字元串截取後再進行顯示。但目前很多流行的語言,如C#、Java內部採用的都是 Unicode 16(UCS2)編碼,在這種編碼中所有的字元都是兩個字元,因此,如果要截取的字元串是中、英文、數字混合的,就會產生問題,如下面的字元串:String s = 「a加b等於c,如果a等1、b等於2,那麼c等3」;上面的字元串既有漢字,又有英文字元和數字。要解決這個問題的方法是首先得到該字元串的UCS2編碼的位元組數組,如下面的代碼如下:byte[] bytes = s.getBytes(」Unicode「);由於上面生成的位元組數組中前兩個位元組是標志位,bytes[0] = -2,bytes[1] = -1,因此,要從第三個位元組開始掃描,對於一個英文或數字字元,UCS2編碼的第二個位元組是相應的ASCII,第一個位元組是0,如a的UCS2編碼是0 97,而漢字兩個位元組都不為0,因此,可以利於UCS2編碼的這個規則來計算實際的位元組數,
⑤ java中文字元輸出問題
這個我網上一找就找到了,代碼只把其中一個減號變成了加號。像你這種截5個6個都是同一個結果的話,就不能按照字元串截取了,要截取位元組了 。代碼如下,我用的是junit測試的,通過沒問題。
public static String bSubstring(String s, int length) throws Exception {
byte[] bytes = s.getBytes("Unicode");
int n = 0; // 表示當前的位元組數
int i = 2; // 要截取的位元組數,從第3個位元組開始
for (; i < bytes.length && n < length; i++) {
if (i % 2 == 1)// 奇數位置,如3、5、7等,為UCS2編碼中兩個位元組的第二個位元組
{
n++; // 在UCS2第二個位元組時n加1
} else {
if (bytes[i] != 0)// 當UCS2編碼的第一個位元組不等於0時,該UCS2字元為漢字,一個漢字算兩個位元組
{
n++;
}
}
}
if (i % 2 == 1)// 如果i為奇數時,處理成偶數
{
if (bytes[i - 1] != 0)// 該UCS2字元是漢字時,修復這個截一半的漢字
i = i + 1;
else
// 該UCS2字元是字母或數字,則保留該字元
i = i + 1;
}
return new String(bytes, 0, i, "Unicode");
}
@Test
public void testGetByte() throws Exception {
String s = "abcd我們回答";
System.out.println(bSubstring(s, 6));
}
、//不好意思,把我所有的測試代碼都發過來了,我只發你需要的這一個方法吧。
⑥ Java 中,數字,漢字,英文字母,...佔多少位元組
半形的數字和英文字母以及標點符號佔用1位元組,全形數字,英文字母和漢字佔用2位元組
⑦ ucs2到gbk轉碼
漢字不同編碼轉換的問題 UCS2轉碼的心得
看到很多朋友都對漢字的unicode編碼有問題, 還需要什麼」unicode漢字對應表」...
一直想回貼子,但太忙(包括忙著從論壇中索取自己需要的東西).
其實漢字的編碼轉換很簡單,我相信C++也應該有相應的函數.希望這些代碼對用Java的朋友有幫助.
/*
* UnicodeTest.java
*
* Created on July 29, 2003, 12:59 PM
*/
/**
*
* @author abc
* @version
*/
public class UnicodeTest
{
public static void main(String args[])
{
UnicodeTest UT = new UnicodeTest();
UT.test1();
}
public void test1()
{
String str = "測試信息abc123";
try
{
byte[] b = str.getBytes("GBK");
System.out.println(str + " -(GBK)編碼: " + bytesToHexStr(b));
System.out.println("");
str = new String(b, "GBK");
System.out.println("從GBK編碼 " + bytesToHexStr(b) + " 重新轉換為字串: " + str);
System.out.println("");
b = str.getBytes("UnicodeBigUnmarked");
System.out.println(str + " -(UCS2)編碼: " + bytesToHexStr(b));
System.out.println("");
str = new String(b, "UnicodeBigUnmarked");
System.out.println("從(UCS2)編碼 " + bytesToHexStr(b) + " 重新轉換為字串: " + str);
System.out.println("");
b = str.getBytes("ASCII");
System.out.println(str + " -(ASCII)編碼: " + bytesToHexStr(b));
System.out.println("");
}
catch(Exception e){}
}
private String bytesToHexStr(byte[] b)
{
if (b == null) return "";
StringBuffer strBuffer = new StringBuffer(b.length * 3);
for(int i = 0; i < b.length; i++)
{
strBuffer.append(Integer.toHexString(b & 0xff));
strBuffer.append(" ");
}
return strBuffer.toString();
}
}
運行此小程序的輸出結果是:
測試信息abc123 -(GBK)編碼: b2 e2 ca d4 d0 c5 cf a2 61 62 63 31 32 33
從GBK編碼 b2 e2 ca d4 d0 c5 cf a2 61 62 63 31 32 33 重新轉換為字串: 測試信息abc123
測試信息abc123 -(UCS2)編碼: 6d 4b 8b d5 4f e1 60 6f 0 61 0 62 0 63 0 31 0 32 0 33
從(UCS2)編碼 6d 4b 8b d5 4f e1 60 6f 0 61 0 62 0 63 0 31 0 32 0 33 重新轉換為字串: 測試信息abc123
測試信息abc123 -(ASCII)編碼: 3f 3f 3f 3f 61 62 63 31 32 33
這段時間都在做聯通的SP網關程序,原來我是做web應用的,對資料庫之類的java編程比較熟悉。原來也從來沒有接觸過簡訊網關方面的系統設計和編程。在這個過程中碰到了幾個比較棘手的問題,UCS2的轉碼就是其中一個。
剛開始我們公司的業務沒有涉及到中文信息,所以沒有注意這個問題,用戶只需要發送字母和數字就可以了,但是最近幾天我在資料庫中發現了一些亂碼,Messagecoding=8,我猜測可能和用戶手機的輸入法有關系,即使是阿拉伯數字也有雙位元組的,比如「8」和「8」。
下面這段代碼是底層的API:
.........(read bytes from input)
//獲取消息編碼
MessageCoding = bodybytes[44];
//獲取短消息內容的長度
SGIP_Command.BytesCopy(bodybytes, abyte0, 45, 48, 0);
MessageLength = SGIP_Command.Bytes4ToInt(abyte0);
//創建一個內容長度的Byte
MessageByte = new byte[MessageLength];
//將Message 到 MessageByte 中
SGIP_Command.BytesCopy(bodybytes, MessageByte, 49, (49 + MessageLength) - 1,0);
//開始解碼轉換
if(MessageCoding==8){//如果編碼格式為UCS2,就轉換成普通的String
try {
MessageContent = new String(MessageByte,"UnicodeBigUnmarked");
} catch (UnsupportedEncodingException e) {
}
}else{
MessageContent = new String(MessageByte);
}
實際上在java中就只需要一句MessageContent = new String(MessageByte,"UnicodeBigUnmarked");就可以轉換過來,再保存到資料庫中就不會是亂碼了。
進行轉換後,我還用了另外一個函數把類似「8」這樣的GBK編碼的阿拉伯數字都轉換成了ASCII的數字。這樣對業務邏輯有幫助。
還有一點要說明一下,GB2312是一個比較早版本的中文編碼格式,GBK是新的中文編碼格式,GBK是GB2312的超集,GB2312是GBK的真子集。
我的底層API是使用的英斯克的底層api,不過我修改了英斯克的API幾個不完善的地方。希望對碰到和我一樣問題的同志有點幫助。
⑧ java 用readline()讀取帶有漢字的文本文檔,怎樣才能做到不亂碼
這個要根據文檔的編碼來處理,可以用read(bytes); new String(bytes, "gbk"); // 或其它編碼ucs2,utf8之類的。
⑨ java,如果 i 奇數改成偶數看不懂,求詳細解釋.
String
x
=
"a";
String
y
=
"加";
String
z
=
"a加";
x.getBytes("Unicode");//[-2,
-1,
0,
97]
y.getBytes("Unicode");//[-2,
-1,
82,
-96]
z.getBytes("Unicode");//[-2,
-1,
0,
97,
82,
-96]
-2,-1是起始,從第三位開始是雙位元組字元(每2位代表一個中文或者英文);
⑩ java做 pdf轉換成圖片 時出現Unknown CMap: UniGB-UCS2-H急~
用jasperreport的exportpdffile那個方法生成pdf到指定的磁碟目錄下,所有的pdf文件生成是生成了,文件大小也不一.但是打開任何pdf文件都是空白的,不知道為什麼,而我換exporthtmlfile的那個方法生成的html文件都能展現正常.由於這個程序是在後台生成文件給mail發送的所以不通過jsp,action的流程,只能在後台指定目錄中生成一個pdf文件,然後用mail去調用的.所以不能用response流生成pdf文件.都是通過傳來的數據生成的pdf,我其他什麼都沒有改動,就只是用exportpdffile生成的pdf文件是空白的,但用exporthtmlfile的方法生成的能展現,說明數據源是沒問題的.不知道為什麼,困繞很久,由於需求只要求傳pdf文件,所以不能用html的文件來傳送,不知道是不是這兩個方法的參數設置有什麼不同嗎?而且pdf的那兩個itext中文包我也導入了,所以不存在字元轉換問題