亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

手機(jī)中文碼制問題的一點(diǎn)理解

2019-11-18 16:11:24
字體:
供稿:網(wǎng)友

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

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

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

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

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

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

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

writeUTF() 和 readUTF() 分別是DataOutputStream 和 DataInputStream對象的的方法,他們提供了一個(gè)由從Unicode到UTF-8的相互轉(zhuǎn)化的途徑。
仔細(xì)看看midp的說明文檔,可以看到以下內(nèi)容
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.


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

/**
* Title:
* Description: unicode字串轉(zhuǎn)換工具
* 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)行了碼制的轉(zhuǎn)換
if(k < 0)
k += 256;
int l = abyte0[j++];
if(l < 0)
l += 256;
char c = (char)(k + (l << 8));//把高位和低位數(shù)組裝起來
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è)位按位轉(zhuǎn)化
abyte0[j++] = (byte)(c >> 8);
}

return abyte0;
}
}

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

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

服務(wù)器到客戶端:
------------------------------------------------------------------
下面代碼是服務(wù)器端把字符寫到Client端,經(jīng)過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 );       //先寫出字符串的長度
out.write( data, 0, dataLength ); //然后寫出轉(zhuǎn)化后的字符串
} catch (IOException e) {
throw new ActionException( IMDefaultAction.class.getName(), e.getMessage() );
}
}

----------------------------------------------------------------------
以下代碼是gbEncoding()方法,把雙字節(jié)字符轉(zhuǎn)換成/uXXXX,ASIIC碼在前面補(bǔ)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;
}
--------------------------------------------------------------------------------


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

代碼:--------------------------------------------------------------------------------
/**
* 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;
}
--------------------------------------------------------------------------------

----------------------------------------------------------------------
客戶端到服務(wù)器:
----------------------------------------------------------------------
客戶端使用下面方法把手機(jī)端的字符編碼成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ù)器端收到客戶端字符流,是用下面方法將其轉(zhuǎn)為UTF-8,以后的操作都是基于UTF-8編碼。SQLServer可能會由于內(nèi)嗎不通有不同的變換,所以存取數(shù)據(jù)庫是還要是具體的DB內(nèi)碼作相應(yīng)的處理。
----------------------------------------------------------------------

代碼:--------------------------------------------------------------------------------
/**
*
* @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;
}

只要手機(jī)支持unicode的gb2312編碼,應(yīng)該都可以顯示正常。

4。至于某些手機(jī)的模擬器不支持中文(譬如nokia 60系列),那真的沒有辦法了,只有等待他的中文版本出來了 呵呵,:)我的信箱是 zhaofei8009@wellhope.sh,非常的歡迎大家來信共同討論這個(gè)問題,也非常的希望交到技術(shù)上的朋友.


共同努力,一起進(jìn)步!

(出處:http://www.49028c.com)



發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
久久久久久久久久久久久久久久久久久| 好看的日韩精品| 伊人网av在线| 69av亚洲| 色综合久久久| 99国产精品久久久久老师| 白丝女仆被免费网站| 在线欧美三区| 91久久国产综合久久91| 草莓视频成人appios| 亚洲激情图片一区| av一级久久| 欧美酷刑日本凌虐凌虐| 永久免费看av| 中文乱码免费一区二区| 久久久久久久久91| 中文字幕一区二区三区乱码| aa片在线观看视频在线播放| 538prom精品视频线放| 欧美自拍偷拍一区二区| 天然素人一区二区视频| 国产精品yjizz视频网一二区| 4438国产精品一区二区| 亚洲春色在线| 国产精品久久久久久久小唯西川| mm131丰满少妇人体欣赏图| 日韩一区二区三区精品| 色香欲www7777综合网| 国产伦精品一区二区三区视频青涩| 日本一区高清不卡| 欧美激情综合五月色丁香| 国产精品午夜久久| 成人在线观看视频网站| 中文字幕影音先锋| 在线观看欧美理论a影院| 六月激情综合网| 欧美理论电影在线观看| 裸体武打性艳史| 337p亚洲精品色噜噜狠狠p| 色悠悠国产精品| 亚洲电影小说图| 欧美久久一区二区三区| 国产中文一区| 欧美激情亚洲视频| 在线观看免费网站黄| 中文字幕久久久久久久| 69xx绿帽三人行| 疯狂蹂躏欧美一区二区精品| 亚洲最大成人免费视频| 欧洲激情一区二区| 影音先锋人妻啪啪av资源网站| 蜜臀av中文字幕| 亚洲成人av一区| 亚洲天堂999| 老司机午夜性大片| www.日本三级| 中文字幕av免费| 91欧美精品成人综合在线观看| 国产伦久视频在线观看| 欧美成人国产一区二区| 久久精品91久久久久久再现| 一区二区三区四区视频| 999久久久久久久久6666| 不卡伊人av在线播放| 貂蝉被到爽流白浆在线观看| 特一级黄色大片| 亚洲码欧美码一区二区三区| 不卡的看片网站| 成人黄色免费网| 国产精品aaaa| 欧美日韩一区视频| 粉嫩av懂色av蜜臀av分享| av在线免费在线观看| 国产清纯在线一区二区www| 亚洲人成人77777线观看| 国产一区国产精品| 美女精品网站| 国产欧美一区二区色老头| 国产一区二区久久久| 日韩一区二区在线观看| 亚洲s色大片在线观看| www日本高清视频| 免费黄网站在线播放| 欧美一级在线亚洲天堂| 欧美一级大黄| 色呦呦在线资源| 中文.日本.精品| 精品国产乱码久久久久久郑州公司| 黑人另类av| 国产精品麻豆网站| 人九九综合九九宗合| 亚洲乱码电影| 日韩资源在线观看| 激情久久免费视频| 国产91精品在线观看| 中文字幕一区二区三区中文字幕| 你懂的在线视频观看| 亚洲自拍偷拍图区| 亚洲国产高潮在线观看| 久久亚洲精品中文字幕| 国产v综合v亚洲欧美久久| 1024国产精品| 中文字幕亚洲精品一区| 国产欧美精品xxxx另类| 成人在线app| 国产成人av电影免费在线观看| 欧美国产高潮xxxx1819| 在线观看亚洲| 91视频com| 91在线视频免费看| 图片区偷拍区小说区| 久久一区精品| 超级碰碰视频| 欧美激情乱人伦| 天干天干啦夜天干天2019| 久久国产精品影视| 伊人久久一区二区| 国产精品激情| 欧美激情另类| 国产精品麻豆一区| 欧美91视频| 国产在线一级片| 日本一区二区在线视频观看| 第一sis亚洲原创| 国产欧美一区二区精品秋霞影院| 天天色天天草| 成人影院在线观看视频| fc2人成共享视频在线观看| 国产女同无遮挡互慰高潮91| 国产97色在线|日韩| 国产人妖一区二区三区| av动漫免费观看| 免费久久精品视频| 黄色av一区二区| 国产剧情一区二区| 久久国产精品久久久久久电车| 日韩精品乱码久久久久久| 欧美123区| 蜜臀久久99精品久久久酒店新书| 国产一区二区女内射| 亚洲综合激情另类专区老铁性| 久草福利视频在线| 国产精品69一区二区三区| 国产精品yjizz| 天堂tv亚洲tv日本tv欧美人tv| 成人自拍视频| 久久久久久九九九九九| 正在播放一区二区| 99热久久这里只有精品| 成人免费电影视频| 香蕉av777xxx色综合一区| 国产高清av片| 川上优的av在线一区二区| 亲爱的老师6电影韩剧| 亚洲国产婷婷| 亚洲最大色图| 国产一区二区久久久久| 精品国产乱码久久久久久鸭王1| 欧美亚洲综合另类| 精品视频一区二区三区免费| 欧美麻豆久久久久久中文| 国产探花一区在线观看| 美女视频a黄免费| 久久艹中文字幕| jzzjzzjzz亚洲成熟少妇| 精品国产免费人成在线观看| 97精品视频在线观看自产线路二| 国产精品白浆一区二小说| 国产成人精品白浆久久69| 国内不卡的一区二区三区中文字幕| 国产精品一区二区三区成人| 亚洲视频一区二区免费在线观看| 在线日韩av永久免费观看| 久久久久久女乱国产| 精品国产乱码久久久久久图片| 欧美成人明星100排名| 香蕉人妻av久久久久天天| 精品人妻少妇AV无码专区| 亚洲成人av电影在线| 91极品美女在线| 成人无码精品1区2区3区免费看| 97人人爽人人爽人人爽| 成人自拍性视频| 视频在线观看一区二区三区| 亚洲精品黑牛一区二区三区| 男男gay免费网站| 在线播放你懂得| 你微笑时很美电视剧整集高清不卡| 无码人妻久久一区二区三区不卡| 国语自产精品视频在线看抢先版结局| 伊人网在线免费| 亚洲电影第三页| 亚洲偷熟乱区亚洲香蕉av| 精品国产乱码久久久久久天美| 91精品国产91热久久久做人人| 色中色一区二区| 中文字幕国产在线观看| 国产精品扒开腿做| 日本视频一区在线观看| 91看片破解版| 性久久久久久久久久久久| 国产激情小视频在线| 91激情在线视频| 草逼视频免费看| 成人av男人的天堂| 精品乱子伦一区二区三区| 97在线资源在| 国产在线高清| 免费观看美女裸体网站| 老牛嫩草一区二区三区日本| 日本不卡在线播放| 免费视频观看成人| 窝窝社区一区二区| 黄色污网站在线免费观看| 欧美一级电影网站| 秋霞午夜一区二区三区视频| 亚洲激情专区| 免费羞羞视频| 精品国产人妻一区二区三区| 欧美va日韩va| y97精品国产97久久久久久| 少妇大叫太大太粗太爽了a片小说| 在线成人午夜影院| 欧美a∨亚洲欧美亚洲| 亚洲va在线观看| 免费看欧美美女黄的网站| 不卡在线视频| 久久露脸国语精品国产91| 欧美三级网站在线观看| 日韩在线观看一区| 欧美xxbbb1手交| 麻豆精品蜜桃视频网站| 国产免费网址| 99热只有这里有精品| 日韩欧美成人一区| 久久国产一二区| 亚洲国产视频二区| 欧美日韩精品一区二区三区视频播放| 亚洲精品久久久久久久久久久久| 天堂在线视频网站| 国产精品入口麻豆完整版| h七七www色午夜日本| 中文字幕在线官网| 亚洲精品第五页| 欧美日韩在线精品一区二区三区激情综| 视频二区欧美| 欧美精品一级二级| 91夜夜蜜桃臀一区二区三区| 国产综合视频| 免费在线黄网站| 精品少妇一区二区| 乱色精品无码一区二区国产盗| 久久国产精品一区二区三区四区| 欧美日韩一区在线播放| 亚洲国产精品久久久久久6q| 岳乳丰满一区二区三区| 欧美综合激情网| 人与牲动交xxxxbbbb高清| 91久久线看在观草草青青| 免费成人在线看| 日韩理论片中文av| 国产在线观看中文字幕| 无码精品在线观看| 国产目拍亚洲精品99久久精品| 欧美日韩喷水| sm一区二区三区| 日本三级理论片| xvideos入口| 久久久777精品电影网影网| 中文字幕资源站| 日本a级片免费观看| av国产在线观看| 中文字幕乱码一区二区| 网站永久看片免费| 91视频久久| 日韩电影在线观看完整版| 国产精品无av码在线观看| 91精品无人成人www| 欧美亚洲在线| 小早川怜子影音先锋在线观看| 亚洲一区二区三区无吗| 91在线视频免费看| 亚洲精品国产精品国自产网站按摩| 日本一级在线观看| 99精品国产九九国产精品| 国产精品一区久久久久| 中文字幕免费高清电视剧网站在线观看| 正在播放木下凛凛xv99| 8x8x拔插拔插影库永久免费| 日本h片在线| 2019最新中文字幕| 特级西西人体4444xxxx| www.超碰在线| 国产人妖ts一区二区| 久久三级福利| 亚洲第一页在线观看| 久久视频在线免费观看| 黄色91av| 欧美一区二区三区在线观看视频| 久久99国产精品一区| 九九热在线视频观看| 日韩av片在线播放| 免费成年人视频在线观看| 在线视频亚洲一区| 秋霞午夜剧场| 51免费午夜啪啪| 亚州av一区二区| 97超碰国产精品| 69成人在线| 青青青青草视频| 国产精选在线| 亚洲激精日韩激精欧美精品| 鲁大师精品99久久久| 精品亚洲乱码一区二区| 日本中文字幕在线一区| 国产成人免费网站| 亚洲我射av| 一区二区免费在线播放| 国产噜噜噜噜噜久久久久久久久| 久久久夜色精品| 福利视频一区二区| 老司机在线永久免费观看| 国产精品国产一区二区| aaaaa黄色片| 国产精品av免费观看| 日韩欧美在线免费观看| 日本不卡123| 亚洲欧美中文另类|