欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
CSDN 文檔中心:手機中文碼制問(wèn)題的一點(diǎn)理解
手機中文碼制問(wèn)題的一點(diǎn)理解
論壇上很多的帖子都是在討論手機上的中文碼制問(wèn)題,我也曾經(jīng)被此類(lèi)的問(wèn)題所困擾,并且得到了不少熱心的朋友的幫助。通過(guò)一端時(shí)間的資料查找和測試學(xué)習,我對這個(gè)問(wèn)題有一點(diǎn)點(diǎn)自己的理解和想法,不敢敝帚自珍,特分享給大家,由于本人水平有限,況且也是業(yè)余的開(kāi)發(fā)愛(ài)好者,沒(méi)有專(zhuān)業(yè)的理論學(xué)習水平,所以請大家就文章中的一些錯誤予以諒解并提出批評,本篇的文章僅做拋磚引玉,非常的歡迎大家的跟貼,我們群策群力,共同來(lái)解決這個(gè)問(wèn)題。:)

  論壇上很多的帖子都是在討論手機上的中文碼制問(wèn)題,我也曾經(jīng)被此類(lèi)的問(wèn)題所困擾,并且得到了不少熱心的朋友的幫助。通過(guò)一端時(shí)間的資料查找和測試學(xué)習,我對這個(gè)問(wèn)題有一點(diǎn)點(diǎn)自己的理解和想法,不敢敝帚自珍,特分享給大家,由于本人水平有限,況且也是業(yè)余的開(kāi)發(fā)愛(ài)好者,沒(méi)有專(zhuān)業(yè)的理論學(xué)習水平,所以請大家就文章中的一些錯誤予以諒解并提出批評,本篇的文章僅做拋磚引玉,非常的歡迎大家的跟貼,我們群策群力,共同來(lái)解決這個(gè)問(wèn)題。:)

手機里面的字符串基本上都是采用的UTF-8的編碼法。
而我們在PC機器上所采用的基本上都是ASCII和unicode編碼法
ASCII編碼法是單字節的編碼方法,只能表示256個(gè)字符,英文字母是足夠了
但是無(wú)法表示漢字
unicode是雙字節的編碼法,可以用來(lái)表示漢字,但是卻對于一般的英文字母浪費了太多的空間(至少面對于手機的存儲是這樣的)。
UTF-8就是專(zhuān)門(mén)手機這種嵌入式設備的新的編碼法,他的特點(diǎn)是,傳統的ASCII字符還是以一個(gè)字節來(lái)表示的,但是如果字符不屬于A(yíng)SCII字符集時(shí),就用兩至三個(gè)位來(lái)表示。
在 0x0001-0x007F之間的字符(傳統的ASCII字符)用一個(gè)位來(lái)表示
  0 | bits0-6
在 0x000以及在0x0080-0x07FF之間的字符使用下面來(lái)表示:
  1 | 1 | 0 | bits 6-10 | 1 | 0 | bits 0-5
如果虛擬機看到這樣的一個(gè)字符的話(huà),虛擬機會(huì )把第一個(gè)字節最前頭的110以及第二個(gè)字節的前頭的10拿掉把剩下的位重新組合成一個(gè)2字節的數位來(lái)表示字符:
  00000 | bits 6-10 | bits 0-5
同理,0x0800 - 0xFFFF的字符表示:
 1 | 1 | 1 | 0 | bits 12-15 | 1 | 0 | bits 6-11 | 1 | 0 | bits 0-5
也可以用同樣的方法重新組合成一個(gè)兩個(gè)字節的字符串來(lái)
 特別需要注意的是kjava中的null字符也使用兩個(gè)字節來(lái)表示而不是一個(gè)字節:)

當然英文字符串在UTF-8編碼法中不會(huì )出什么問(wèn)題(默認為標準的ACSII編碼機制)主要的問(wèn)題還是中文,我個(gè)人在Kjava的手機開(kāi)發(fā)中中文字符串所碰到的問(wèn)題主要分為以下幾類(lèi):
 1.rms數據庫讀寫(xiě)的問(wèn)題;
 2.在jad中書(shū)寫(xiě)游戲中文名稱(chēng);
 3.網(wǎng)絡(luò )傳輸中中文問(wèn)題(kxml傳輸的解碼);
 4.部分的模擬器也不支持中文.
這幾個(gè)部分是在手機開(kāi)發(fā)中,中文經(jīng)常出錯的險區,通常的表現形式是亂碼:)

1.了解到了UTF-8碼的基本原理就非常的有利于我們解決碼制轉化的問(wèn)題
在轉化UTF-8碼中我處理的方法是這樣的

//向數據庫中寫(xiě)入中文
String appt3 = ‘中文字符‘;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
dos.writeUTF(appt3);
byte[] bytes3 = bos.toByteArray();
rs.addRecord(bytes3, 0, bytes3.length);

//從數據庫中讀出中文
byte b3[] = rs.getRecord(dbid);
DataInputStream dis=new DataInputStream(new ByteArrayInputStream(b3));
String chinastring = dis.readUTF();

writeUTF() 和 readUTF() 分別是DataOutputStream 和 DataInputStream對象的的方法,他們提供了一個(gè)由從Unicode到UTF-8的相互轉化的途徑。
仔細看看midp的說(shuō)明文檔,可以看到以下內容
writeUTF() :
First, two bytes are written to the output stream as if by the writeShort method giving the number of bytes to follow. This value is the number of bytes actually written out, not the length of the string. Following the length, each character of the string is output, in sequence, using the UTF-8 encoding for the character.If no exception is thrown, the counter written is incremented by the total number of bytes written to the output stream. This will be at least two plus the length of str, and at most two plus thrice the length of str.

當然我們也可以自己來(lái)手工的編寫(xiě)代碼,把中文字符串轉化成byte[]再放入RMS,取出時(shí)轉成String即可。
這里借用bingo_guan的方法(bingo_guan,請不要介意呀 :)),當然了這段代碼也非常的設計模式化 :) hehe,這個(gè)類(lèi)也可用于文本文件操作。

/**
*

Title:


*
Description: unicode字串轉換工具


*
Copyright: Copyright (c) 2003


*
Company: CC Studio


* @author Bingo
* @version 1.0
*/

public class UnicodeString
{

public UnicodeString()
{
}

public static String byteArrayToString(byte abyte0[], int i)
{
StringBuffer stringbuffer = new StringBuffer(‘‘);
for(int j = 0; j < i; )
{
int k = abyte0[j++]; //注意在這個(gè)地方進(jìn)行了碼制的轉換
if(k < 0)
k += 256;
int l = abyte0[j++];
if(l < 0)
l += 256;
char c = (char)(k + (l << 8));//把高位和低位數組裝起來(lái)
stringbuffer.append(c);
}

return stringbuffer.toString();
}

public static String byteArrayToString(byte abyte0[])
{
return byteArrayToString(abyte0, abyte0.length);
}

public static byte[] stringToByteArray(String s)
{
int i = s.length();
byte abyte0[] = new byte[i << 1];
int j = 0;
for(int k = 0; k < i; k++)
{
char c = s.charAt(k);
abyte0[j++] = (byte)(c & 0xff); //每一個(gè)位按位轉化
abyte0[j++] = (byte)(c >> 8);
}

return abyte0;
}
}
2.其次,在jad和manifest中的中文字(比如說(shuō)游戲的名字)實(shí)際上也都是 UTF-8編碼,這一塊也是經(jīng)常出問(wèn)題的險區,我建議還是自己手工轉化成UTF-8的編碼寫(xiě)在上面,否則的話(huà),如果你用unicode碼制寫(xiě)入中文的話(huà),在模擬器或者實(shí)際設備上就有無(wú)法識別而導致程序不能執行的危險。所以大家在編輯jad文件的時(shí)候應該盡量小心才好 :) 特別注意,wtk的jad自動(dòng)生成的工具并不支持直接在jad和manifest輸入UTF-8格式,所以手工修改這一步恐怕是免不了的了 :(。

3.不同的手機其實(shí)支持的默認碼制也是不一樣的,這也是經(jīng)常出現問(wèn)題的關(guān)鍵,CLDC的系統屬性‘microedition.encoding‘定義了設備的默認字符編碼,它的值可以使用System.getProperty方法取得。我們也可以轉化成相關(guān)的支持的編碼機制來(lái)實(shí)際的運行我們的程序。
這種方式我們通常會(huì )用在有關(guān)手機中文問(wèn)題傳輸中,因為在聯(lián)網(wǎng)時(shí)的手機是不確定的。以下我給出一段實(shí)例代碼,和大家探討一下這個(gè)問(wèn)題。

服務(wù)器到客戶(hù)端:
------------------------------------------------------------------
下面代碼是服務(wù)器端把字符寫(xiě)到Client端,經(jīng)過(guò)gbEncoding()方法,所有的字符編碼成:\uXXXX.
-----------------------------------------------------------------

代碼:-------------------------------------------------------------
/**
* Write the String data
*
* @param out
* @param value
*/
public static void writeUnicode(final DataOutputStream out, final String value) throws ActionException {
try {
final String unicode = StringFormatter.gbEncoding( value );
final byte[] data = unicode.getBytes();
final int dataLength = data.length;

System.out.println( ‘Data Length is: ‘ + dataLength );
System.out.println( ‘Data is: ‘ + value );
out.writeInt( dataLength ); //先寫(xiě)出字符串的長(cháng)度
out.write( data, 0, dataLength ); //然后寫(xiě)出轉化后的字符串
} catch (IOException e) {
throw new ActionException( IMDefaultAction.class.getName(), e.getMessage() );
}
}

----------------------------------------------------------------------
以下代碼是gbEncoding()方法,把雙字節字符轉換成\uXXXX,ASIIC碼在前面補00。
----------------------------------------------------------------------
/**
* This method will encode the String to unicode.
*
* @param gbString
* @return
*/

代碼:--------------------------------------------------------------------------------
public static String gbEncoding( final String gbString ) {
char[] utfBytes = gbString.toCharArray();
String unicodeBytes = ‘‘;
for( int byteIndex = 0; byteIndex < utfBytes.length; byteIndex ++ ) {
String hexB = Integer.toHexString( utfBytes[ byteIndex ] );
if( hexB.length() <= 2 ) {
hexB = ‘00‘ + hexB;
}
unicodeBytes = unicodeBytes + ‘\\u‘ + hexB;
}
System.out.println( ‘unicodeBytes is: ‘ + unicodeBytes );
return unicodeBytes;
}
--------------------------------------------------------------------------------

----------------------------------------------------------------------
在客戶(hù)端收到服務(wù)器的數據,先將其一個(gè)一個(gè)字符解碼。雙字節顯示正常。
----------------------------------------------------------------------

代碼:--------------------------------------------------------------------------------
/**
* This method will decode the String to a recognized String
* in ui.
* @param dataStr
* @return
*/
private StringBuffer decodeUnicode( final String dataStr ) {
int start = 0;
int end = 0;
final StringBuffer buffer = new StringBuffer();
while( start > -1 ) {
end = dataStr.indexOf( ‘\\u‘, start + 2 );
String charStr = ‘‘;
if( end == -1 ) {
charStr = dataStr.substring( start + 2, dataStr.length() );
} else {
charStr = dataStr.substring( start + 2, end);
}
char letter = (char) Integer.parseInt( charStr, 16 ); // 16進(jìn)制parse整形字符串。
buffer.append( new Character( letter ).toString() );
start = end;
}
return buffer;
}
--------------------------------------------------------------------------------

----------------------------------------------------------------------
客戶(hù)端到服務(wù)器:
----------------------------------------------------------------------
客戶(hù)端使用下面方法把手機端的字符編碼成ISO-8859-1,傳給服務(wù)器。
----------------------------------------------------------------------
代碼:--------------------------------------------------------------------------------
/**
* write the String data
* @param value
* @param outData
*/
private void writeSjis(DataOutputStream outData, String value) {
try {
byte[] data = null;
// data = ( value ).getBytes( ‘UTF-8‘ );
data = ( value ).getBytes( ‘ISO8859_1‘ );
outData.writeInt(data.length);
outData.write(data, 0, data.length);

System.out.println(‘ data.length: ‘ + data.length);
System.out.println(‘ data.value: ‘ + value);
} catch (Exception ex) {
System.out.println(‘ write error ‘);
ex.printStackTrace();
}
}
--------------------------------------------------------------------------------

----------------------------------------------------------------------
服務(wù)器端收到客戶(hù)端字符流,是用下面方法將其轉為UTF-8,以后的操作都是基于UTF-8編碼。SQLServer可能會(huì )由于內嗎不通有不同的變換,所以存取數據庫是還要是具體的DB內碼作相應的處理。
----------------------------------------------------------------------

代碼:--------------------------------------------------------------------------------
/**
*
* @param iso
* @return
*/
public static String isoToUtf( final String iso ) {
String utfString = iso;
if( iso != null ) {
try {
utfString = new String( iso.getBytes( ‘ISO-8859-1‘ ), ‘UTF-8‘ );
} catch ( UnsupportedEncodingException e ) {
utfString = iso;
}
} else {
utfString = ‘‘;
}
return utfString;
}

只要手機支持unicode的gb2312編碼,應該都可以顯示正常。

4。至于某些手機的模擬器不支持中文(譬如nokia 60系列),那真的沒(méi)有辦法了,只有等待他的中文版本出來(lái)了 呵呵,:)
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
java亂碼問(wèn)題分析
初學(xué)入門(mén):JAVA里字符編碼的探索與理解 - 全部文章 - 技術(shù)學(xué)習
JAVA里字符編碼 - Java - linxh
Java中文問(wèn)題詳解,底層編碼解剖
C# 如何將一個(gè)字符串轉換成字節數組”與“如何將一個(gè)字節數組轉換成一個(gè)字符串
Tomcat關(guān)于encoding編碼的默認設置以及亂碼產(chǎn)生的原因
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久