日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

汉字区位码查询与算法

發(fā)布時間:2023/12/14 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汉字区位码查询与算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
20060427-漢字區(qū)位碼查詢與算法——microsoft visual studio 2005系列


[url]www.tuenhai.com[/url] 20060427


要從事學(xué)術(shù)研究,一定要學(xué)好數(shù)學(xué),數(shù)學(xué)可以把對事物的描述精確化。
tuenhai為什么要學(xué)習(xí)編程?其中一個原因就是利用編程工具進(jìn)行一些數(shù)學(xué)運算。
記得大約10年前,那時tuenhai還沒有電腦,要進(jìn)行大數(shù)計算,怎么辦?那時就到處打聽,哪里有數(shù)位多一些的計算器。一般計算器只有8位,多一些的12位,還是不夠用。有一次和故人到大城市,總算打聽到了超過12位的計算器,考慮再三,還是沒有買下來(不知故人還有沒有記得這件事,畢竟過去這么多年了)。

父親把我們以前讀過的教材,練習(xí)本都保存著,我把粘滿灰塵的數(shù)學(xué)教材找出來,放在我的書房,有時還會去隨便翻翻。
現(xiàn)在學(xué)校教育是徹頭徹尾的失敗。教育沒有和實際結(jié)合,畢業(yè)不久,學(xué)過的知識就很多交還給老師了。想起來,學(xué)校教育至少浪費了我5年光陰,工作中又至少浪費了我8年光陰,從出生到現(xiàn)在,竟有近一半時間浪費掉了,實在可怕。

把學(xué)校教育批評得一無是處,那么理想的教育應(yīng)該是怎么樣的呢?
理想的教育應(yīng)該是一切學(xué)科相通的,只有這樣,知識才能活起來,學(xué)而即用,不用死記。這樣的學(xué)習(xí),只有快樂,沒有痛苦。

這樣的學(xué)校教育可謂是完美,在這個不完美的世界可能永遠(yuǎn)不會實現(xiàn)。就象中醫(yī),這么多人說要發(fā)揚真正的中醫(yī),但現(xiàn)代人沒有這個福氣,連偽中醫(yī)都要衰落,何況真中醫(yī)?,F(xiàn)代“小火神”為什么不寫書,或許有深機在焉。

一切學(xué)科相通,從而理解這個世界,這個題目太大了,tuenhai(tuenhai.com)也只是玩味了一點點。這里只討論一下用編程的方法數(shù)字與漢字的轉(zhuǎn)換,同時也附錄一些資料,方便研究。



'tuenhai所用獲得漢字或字符對應(yīng)的區(qū)位符
Function quwei(ByVal x As String) As String '
x = Asc(x) 'Asc 返回輸入字符的碼位或字符代碼。對于單字節(jié)字符集 (SBCS),返回值范圍為 0 到 255;對于雙字節(jié)字符集 (DBCS),返回值范圍為 -32768 到 32767。對于單字節(jié) ASCII 字符的圖表,請參見 ASCII 字符代碼。
x = Hex((x)) '返回表示數(shù)字的十六進(jìn)制值的字符串。劉=FFFFC1F5,前面的4個F去掉,得到16進(jìn)制的內(nèi)碼。16進(jìn)制的C=10進(jìn)制的12
Dim str As String
str = Format(CDec("&H" & Strings.Mid(x, 5, 2)) - 160, "00") & Format(CDec("&H" & Strings.Mid(x, 7, 2)) - 160, "00")
'Strings.Mid(x, 5, 2) '得到16進(jìn)制的內(nèi)碼,“劉”內(nèi)碼高位=C1
'CDec("&H" & str) '轉(zhuǎn)換成10進(jìn)制內(nèi)碼,"&H"表示16進(jìn)制 “劉”內(nèi)碼高位=193
'-160 得到10進(jìn)制區(qū)碼, “劉”區(qū)碼是33
'Format(decQu, "00") '格式化為兩位數(shù)表示
Return str
End Function
'GB2312的原文還是區(qū)位碼,從區(qū)位碼到內(nèi)碼,需要在高字節(jié)和低字節(jié)上分別加上A0,
'在DBCS中,GB內(nèi)碼的存儲格式始終是big endian,即高位在前。
' 區(qū)位碼是與漢字一一對應(yīng)的編碼,用四位數(shù)字表示, 前兩位從01 到94稱區(qū)碼,后兩位從01到94稱位碼。 一個漢字的前一半是 ASCⅡ碼為“160+區(qū)碼”的字符,后一半是ASCⅡ碼為“160+ 位碼”的字符。
'例如:“劉”的區(qū)位碼是 3385,其意為區(qū)碼33位碼85,它是由ASCⅡ碼為160+33=193和160+85=245的兩個字符組成。






'tuenhai所用獲得區(qū)位符對應(yīng)漢字或字符
Function hanzi(ByVal x As String) As String '
On Error Resume Next
Dim str As String
str = Chr("&H" & Hex(Val(Strings.Left(x, 2)) + 160) & Hex(Val(Strings.Right(x, 2)) + 160))
Return (str)
End Function
'Chr 使用 System.Text 命名空間中的 Encoding 類來確定當(dāng)前線程使用的是單字節(jié)字符集 (SBCS) 還是雙字節(jié)字符集 (DBCS)。然后將 CharCode 作為相應(yīng)字符集中的碼位。對于 SBCS 字符,范圍為 0 到 255,對于 DBCS 字符,范圍為 -32768 到 65535。
'ChrW 以 CharCode 作為 Unicode 碼位。其范圍與當(dāng)前線程的區(qū)域性和代碼頁設(shè)置無關(guān)。-32768 到 -1 范圍內(nèi)的值的處理方式與 +32768 到 +65535 范圍內(nèi)的值相同。



(更多文章請訪問[url]www.tuenhai.com[/url] 20060427 剡)


漢字區(qū)位碼,區(qū)位碼查詢,姓名區(qū)位碼,漢字區(qū)位碼查詢,區(qū)位碼輸入法,漢字區(qū)位碼查詢系統(tǒng),姓名及區(qū)位碼,姓名區(qū)位碼查詢,電話區(qū)位碼查詢,區(qū)位碼下載,常用漢字區(qū)位碼,漢字區(qū)位碼對照表,康保區(qū)位碼,漢字轉(zhuǎn)換區(qū)位碼,電話區(qū)位碼,數(shù)字區(qū)位碼,區(qū)位碼輸入法下載,區(qū)位碼速查,區(qū)位碼轉(zhuǎn)換,區(qū)位碼查找,區(qū)位碼查詢系統(tǒng),區(qū)位碼查詢軟件,漢字區(qū)位碼轉(zhuǎn)換工具,漢字區(qū)位碼查詢器,名字區(qū)位碼,區(qū)位碼是什么,區(qū)位碼信息點,查區(qū)位碼,什么是漢字區(qū)位碼,區(qū)位碼軟件,怎么學(xué)習(xí)區(qū)位碼,中國區(qū)位碼,區(qū)位碼輸入法怎么用,漢字區(qū)位碼下載,手機區(qū)位碼查詢,豬的區(qū)位碼,漢字的區(qū)位碼,漢字的區(qū)位碼搜索,輝區(qū)位碼,區(qū)位碼5.0,金山詞霸區(qū)位碼,區(qū)位碼與國標(biāo)碼,漢字區(qū)位碼輸入法,漢字區(qū)位碼查詢軟件,區(qū)位碼國際碼機內(nèi)碼,漢字區(qū)位碼速查,考生姓名區(qū)位碼,句號的區(qū)位碼,姓名及區(qū)位碼查詢,區(qū)位碼字根表,漢字區(qū)位碼手冊,長途電話區(qū)位碼查詢,姓名區(qū)位碼轉(zhuǎn)換軟件,漢字區(qū)位識別碼,區(qū)位碼與國際碼關(guān)系,世界國際區(qū)位碼,全國電話區(qū)位碼查詢,文字區(qū)位碼,區(qū)位代碼,區(qū)位輸入法,區(qū)位碼表,區(qū)位理論,漢字區(qū)位碼表,手機區(qū)位查詢,城市的區(qū)位因素,漢字區(qū)位代碼,古典區(qū)位論,區(qū)位輸入法下載,姓名區(qū)位代碼,電話區(qū)位,杭州城市區(qū)位分析,電話區(qū)位查詢,區(qū)位優(yōu)勢,農(nóng)業(yè)的區(qū)位選擇,杭州區(qū)位分析,工業(yè)的區(qū)位因素,農(nóng)業(yè)區(qū)位論,電話區(qū)位號,區(qū)位分析,區(qū)位因素,手機區(qū)位,城市區(qū)位因素,電話區(qū)位號碼,區(qū)位專題,農(nóng)業(yè)區(qū)位,工業(yè)的區(qū)位選擇,農(nóng)業(yè)區(qū)位因素,城市土地的區(qū)位選擇,區(qū)位號碼,房地產(chǎn)區(qū)位理論,手機號碼區(qū)位查詢,



附錄:




從漢字到區(qū)位碼的轉(zhuǎn)換

http://blog.csdn.net/leeajax/archive/2004/07/12/39686.aspx
學(xué)校要我們填寫畢業(yè)生的情況表,機讀卡那種,姓名要用區(qū)位碼.我想如果用程序來查詢的話,就是數(shù)據(jù)庫查找,我想編一個應(yīng)該很簡單的,就上網(wǎng)看看有沒有類似的程序,然后我再用它的數(shù)據(jù)庫自己實現(xiàn)一個,可讓我查到了一個文章講如何實現(xiàn)從漢字到區(qū)位碼的轉(zhuǎn)換,呵呵,可以不用數(shù)據(jù)庫了.
區(qū)位碼是與漢字一一對應(yīng)的編碼,用四位數(shù)字表示, 前兩位從01 到94稱區(qū)碼,后兩位從01到94稱位碼。 一個漢字的前一半是 ASCⅡ碼為“160+區(qū)碼”的字符,后一半是ASCⅡ碼為“160+ 位碼”的字符。
例如:“劉”的區(qū)位碼是 3385,其意為區(qū)碼33位碼85,它是由ASCⅡ碼為160+33=193和160+85=245的兩個字符組成。

我用簡單的控制臺程序?qū)崿F(xiàn)如下
#include
#include
void main()
{
char i[64];
while(1)
{
cout<<"輸入單個字母退出"< cin>>i;
if(strlen(i)==1)break;
for(int j=0;j cout<<(i[j]+96)*100+i[j+1]+96< }
}








如何隨機生成指定數(shù)目的國標(biāo)漢字?


http://blog.csdn.net/northwolves/archive/2004/07/25/51270.aspx

為了使每一個漢字有一個全國統(tǒng)一的代碼,1980年,我國頒布了第一個漢字編碼的國家標(biāo)準(zhǔn): GB2312-80《信息交換用漢字編碼字符集》基本集,這個字符集是我國中文信息處理技術(shù)的發(fā)展基礎(chǔ),也是目前國內(nèi)所有漢字系統(tǒng)的統(tǒng)一標(biāo)準(zhǔn)。由于國標(biāo)碼是四位十六進(jìn)制,為了便于交流,大家常用的是四位十進(jìn)制的區(qū)位碼。所有的國標(biāo)漢字與符號組成一個94×94的矩陣。在此方陣中,每一行稱為一個"區(qū)",每一列稱為一個"位",因此,這個方陣實際上組成了一個有94個區(qū)(區(qū)號分別為0 1到94)、每個區(qū)內(nèi)有94個位(位號分別為01到94)的漢字字符集。一個漢字所在的區(qū)號和位號簡單地組合在一起就構(gòu)成了該漢字的"區(qū)位碼"。在漢字的區(qū)位碼中,高兩位為區(qū)號,低兩位為位號。 在區(qū)位碼中,01-09區(qū)為682個特殊字符,16~87區(qū)為漢字區(qū),包含6763個漢字 。其中16-55區(qū)為一級漢字(3755個最常用的漢字,按拼音字母的次序排列),56-87區(qū)為二級漢字(3008個漢字,按部首次序排列)。

所以,當(dāng)我們需要n個任意漢字時,我們不必建一個全部漢字表,而是利用區(qū)位碼實現(xiàn)常用漢字的提取。

下面的代碼可以實現(xiàn)任意數(shù)目漢字的生成:

Private Sub getrndhanzi(ByVal n As Integer)
Dim s() As String, i As Integer
Dim temp1 As Integer, temp2 As Integer
ReDim s(1 To n)
Randomize
For i = 1 To n
temp1 = 16 + Int(Rnd * 72)
If temp1 = 55 Then
temp2 = Int(Rnd * 90) '一級漢字從1601-1694,1701-1794,.....5401-5494,5501-5589,共94*40-5=3755 個漢字
Else
temp2 = Int(Rnd * 95) '二級漢字從5601-5694,5701-5794,.....8601-8694,8701-8794,共94*32=3008 個漢字
End If
s(i) = Chr("&H" & Hex(temp1 + 160) & Hex(temp2 + 160))
Next
Debug.Print Join(s, "")'輸出
End Sub

Private Sub Command1_Click()
Dim i As Integer
For i = 1 To 25 '分別生成1-25個任意漢字
getrndhanzi i
Next
End Sub

輸出:


夫敞
途罨椽
涅搦侄鋱
榨藸禒艟球
枵舟斟盯灘桫
猻暗田苫撂蕾岢
冠澧炫鲼噘惺馘柘
巧愁炔嗶臆策秈錠昏
紶假媼慈乘嘎膚景濡薤
呋刨鍾灰櫸懋唇弱獻(xiàn)囟垤
均耋撤闐驛邇愍殞堝砸宕薅
蒹翦俄形碌哧烀爝懶繚嬪捭渾
瑾砜疬嚌遒濂勾彐綘珩苓就萌炳
光槨旖趁鯤頎壕狁媼暑額愾帷淤黹
湫熏褲降旺廓淳傻蛻脬蓀色注紫劾吾
陶瀝瑗骶埴于喃刮癭突賅斛簡銓觴抨唼
格鴿乜衍夙菀鱺敗陸褐噲苑滓淆踵訖頭綁
德泠婷岙湔池槳郅峁汩卒控訴芻鏜椎鬣越嫉
義懂聶其定鰳脯膪巰吐昏罰返抖陵沌戧喘茺緙
廢霧旯浠疼贓勛妓鱒埏幫盂蕹朐裂祆膻拌脎威純
宛免作繡稞涑梟搬懌旦熨呈棄馳翔聚飾栩燧艴氫貧
豕源髑乍蚍夏己履畢芤毀簣子褊崖壞忑霉鈿瘢駔遷裨
獬紛胚槳衫蹣瘋祧武琢吣酃踱免逘濁頇坐磬挫鄶嬸繆錳
拽技薯帙陜槲逗蜱嘧雌怙詿橢踉盔锍認(rèn)致暝榴蘗逆捻螨噬

附:

漢字與區(qū)位碼轉(zhuǎn)換代碼:

Function quwei(ByVal x As String) As String '獲得某漢字或字符對應(yīng)的的區(qū)位碼
If Asc(x) >= 0 Then Exit Function
x = Hex(Asc(x))
quwei = Format(CDec("&H" & Left(x, 2)) - 160, "00") & Format(CDec("&H" & Right(x, 2)) - 160, "00")
End Function


Function hanzi(ByVal x As String) As String'獲得某區(qū)位碼對應(yīng)漢字或字符
hanzi = Chr("&H" & Hex(Val(Left(x, 2)) + 160) & Hex(Val(Right(x, 2)) + 160))
End Function








經(jīng)驗總結(jié)--字符串與編碼



http://www.cnblogs.com/hellosnoopy/articles/98127.html

Posted on 2005-01-27 12:17 HelloSnoopy開發(fā)田地 閱讀(229) 評論(0) 編輯 收藏 收藏至365Key
SRC:http://search.csdn.net/Expert/topic/1880/1880675.xml?temp=3.344363E-02
這幾個月作手機短信的項目,碰到了很多字符編碼的問題,真頭痛。經(jīng)過多番資料的搜索、親手嘗試和高人的指點,現(xiàn)在好像沒那么迷惘了?,F(xiàn)作了一些總結(jié)跟大家分享(有誤之處請指點)

首先應(yīng)該把字節(jié)數(shù)組看成是String的載體。
dot Net使用的字符串String是Unicode編碼的;它也是以Unicode編碼的形式顯示字符串。

以下是用自己語言對幾個常用函數(shù)的說明:
(自己總結(jié)的,反正看不明MSDN)
bytes=System.Text.Encoding.Unicode.GetBytes(str)
作用:把str的載體作Unicode->Unicode的編碼轉(zhuǎn)換--也就是沒有對載體作任何的轉(zhuǎn)換。因些使用此函數(shù)可以得代表該String載體的字節(jié)數(shù)組。
str=System.Text.Encoding.Unicode.GetString(bytes)
作用:對字節(jié)數(shù)組作Unicode->Unicode的編碼轉(zhuǎn)換--即沒有轉(zhuǎn)換,把經(jīng)過轉(zhuǎn)換后的字節(jié)數(shù)組作為str的載體。

bytes=System.Text.Encoding.Utf8.GetBytes(str)
作用:把str的載體作Utf8->Unicode的編碼轉(zhuǎn)換。返回的是經(jīng)過轉(zhuǎn)換后的字符數(shù)組
str=System.Text.Encoding.Utf8.GetString(bytes)
作用:對字節(jié)數(shù)組作Gb2312->Unicode的編碼轉(zhuǎn)換,把經(jīng)過轉(zhuǎn)換后的字節(jié)數(shù)組作為str的載體。

bytes=System.Text.Encoding.GetEncoding("GB2312").GetBytes(str)
作用:把str的載體作Gb2312->Unicode的編碼轉(zhuǎn)換。返回的是經(jīng)過轉(zhuǎn)換后的字符數(shù)組
str=System.Text.Encoding.GetEncoding("GB2312").GetString(bytes)
作用:對字節(jié)數(shù)組作Gb2312->Unicode的編碼轉(zhuǎn)換,把經(jīng)過轉(zhuǎn)換后的字節(jié)數(shù)組作為str的載體。

如此類推
bytes=System.Text.Encoding.GetEncoding("XXX").GetBytes(str)
作用:把str的載體作XXX->Unicode的編碼轉(zhuǎn)換。返回的是經(jīng)過轉(zhuǎn)換后的字符數(shù)組
str=System.Text.Encoding.GetEncoding("XXX").GetString(bytes)
作用:對字節(jié)數(shù)組作XXX->Unicode的編碼轉(zhuǎn)換,把經(jīng)過轉(zhuǎn)換后的字節(jié)數(shù)組作為str的載體。

這里是我收集的一些有關(guān)字符編碼的資料:http://61.145.116.154/bm/
還有:
http://www.unicode.org/charts/unihan.html
根據(jù)Unicode編碼查其對應(yīng)字符的字形、Utf8、漢字區(qū)位碼等
http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/GB/GB2312.TXT Unicode與Gb2312的對照表
http://www.sun.com/developers/gadc/technicalpublications/articles/mabiao.txt
Unicode與Gbk對照表










用C#生成中文漢字驗證碼的基本原理


http://dev.csdn.net/develop/article/67/67031.shtm

前幾天去申請免費QQ號碼,突然發(fā)現(xiàn)申請表單中的驗證碼內(nèi)容換成了中文,這叫真叫我大跌眼鏡感到好笑,Moper上的貓兒們都大罵騰訊采用中文驗證碼。^_^
我不得不佩服騰訊為了防止目前網(wǎng)絡(luò)上橫行的QQ號碼自動注冊機而采取中文驗證碼的手段。仔細(xì)想了想感覺用程序生成隨機的中文驗證碼并不是很難,下面就來介紹一下使用C#生成隨機的中文漢字的原理。


1、漢字編碼原理
到底怎么辦到隨機生成漢字的呢?漢字從哪里來的呢?是不是有個后臺數(shù)據(jù)表,其中存放了所需要的所有漢字,使用程序隨機取出幾個漢字組合就行了呢?使用后臺數(shù)據(jù)庫先將所有漢字存起來使用時隨機取出,這也是一種辦法,但是中文漢字有這么多,怎么來制作呢?其實可以不使用任何后臺數(shù)據(jù)庫,使用程序就能做到這一切。要知道如何生成漢字,就得先了解中文漢字的編碼原理。
1980年,為了使每一個漢字有一個全國統(tǒng)一的代碼,我國頒布了第一個漢字編碼的國家標(biāo)準(zhǔn): GB2312-80《信息交換用漢字編碼字符集》基本集,簡稱GB2312,這個字符集是我國中文信息處理技術(shù)的發(fā)展基礎(chǔ),也是國內(nèi)所有漢字系統(tǒng)的統(tǒng)一標(biāo)準(zhǔn)。到了后來又公布了國家標(biāo)準(zhǔn)GB18030-2000《信息交換用漢字編碼字符集基本集的擴充》,簡稱GB18030,編程時如果涉及到編碼和本地化的朋友應(yīng)該對GB18030很熟悉。這是是我國繼GB2312-1980和GB13000-1993之后最重要的漢字編碼標(biāo)準(zhǔn),同時也是未來我國計算機系統(tǒng)必須遵循的基礎(chǔ)性標(biāo)準(zhǔn)之一。
目前在中文WINDOWS操作系統(tǒng)中,.NET編程中默認(rèn)的的代碼頁就是GB18030簡體中文。但是事實上如果生成中文漢字驗證碼只須要使用GB2312字符集就已經(jīng)足夠了。字符集中除了我們平時大家都認(rèn)識的漢字外,也包含了很多我們不認(rèn)識平時也很少見到的漢字。如果生成中文漢字驗證碼中有很多我們不認(rèn)識的漢字讓我們輸入,對于使用拼音輸入法的朋友來說可不是好事,五筆使用者還能勉強根據(jù)漢字的長相打出來,呵呵!所以對于GB2312字符集中的漢字我們也不是全都要用。
中文漢字字符可以使用區(qū)位碼來表示,見

漢字區(qū)位碼表 http://navicy2005.home4u.china.com/resource/gb2312tbl.htm
漢字區(qū)位碼代碼表 http://navicy2005.home4u.china.com/resource/gb2312tbm.htm

其實這兩個表是同一回事,只不過一個使用十六進(jìn)制分區(qū)表示,一個使用區(qū)位所在的數(shù)字位置表示。 例如“好”字的十六進(jìn)制區(qū)位碼是ba c3,前兩位是區(qū)域,后兩位代表位置,ba處在第26區(qū),“好”處在此區(qū)漢字的第35位也就是c3位置,所以數(shù)字代碼就是2635。這就是GB2312漢字區(qū)位原理。根據(jù)《漢字區(qū)位碼表 》我們可以發(fā)現(xiàn)第15區(qū)也就是AF區(qū)以前都沒有漢字,只有少量符號,漢字都從第16區(qū)B0開始,這就是為什么GB2312字符集都是從16區(qū)開始的。

2、.Net程序處理漢字編碼原理分析
在.Net中可以使用System.Text來處理所有語言的編碼。在System.Text命名空間中包含眾多編碼的類,可供進(jìn)行操作及轉(zhuǎn)換。其中的Encoding類就是重點處理漢字編碼的類。通過在.NET文檔中查詢Encoding類的方法我們可以發(fā)現(xiàn)所有和文字編碼有關(guān)的都是字節(jié)數(shù)組,其中有兩個很好用的方法:


Encoding.GetBytes ()方法將指定的 String 或字符數(shù)組的全部或部分內(nèi)容編碼為字節(jié)數(shù)組
Encoding.GetString ()方法將指定字節(jié)數(shù)組解碼為字符串。

沒錯我們可以通過這兩個方法將漢字字符編碼為字節(jié)數(shù)組,同樣知道了漢字GB2312的字節(jié)數(shù)組編碼也就可以將字節(jié)數(shù)組解碼為漢字字符。通過對“好”字進(jìn)行編碼為字節(jié)數(shù)組后


Encoding gb=System.Text.Encoding.GetEncoding("gb2312");
object[] bytes=gb.Encoding.GetBytes ("好");

發(fā)現(xiàn)得到了一個長度為2的字節(jié)數(shù)組bytes,使用


string lowCode = System.Convert.ToString(bytes[0], 16); //取出元素1編碼內(nèi)容(兩位16進(jìn)制)
string hightCode = System.Convert.ToString(bytes[1], 16);//取出元素2編碼內(nèi)容(兩位16進(jìn)制)

之后發(fā)現(xiàn)字節(jié)數(shù)組bytes16進(jìn)制變碼后內(nèi)容竟然是{ba,c3},剛好是“好”字的十六進(jìn)制區(qū)位碼(見區(qū)位碼表)。
因此我們就可以隨機生成一個長度為2的十六進(jìn)制字節(jié)數(shù)組,使用GetString ()方法對其進(jìn)行解碼就可以得到漢字字符了。不過對于生成中文漢字驗證碼來說,因為第15區(qū)也就是AF區(qū)以前都沒有漢字,只有少量符號,漢字都從第16區(qū)B0開始,并且從區(qū)位D7開始以后的漢字都是和很難見到的繁雜漢字,所以這些都要排出掉。所以隨機生成的漢字十六進(jìn)制區(qū)位碼第1位范圍在B、C、D之間,如果第1位是D的話,第2位區(qū)位碼就不能是7以后的十六進(jìn)制數(shù)。在來看看區(qū)位碼表發(fā)現(xiàn)每區(qū)的第一個位置和最后一個位置都是空的,沒有漢字,因此隨機生成的區(qū)位碼第3位如果是A的話,第4位就不能是0;第3位如果是F的話,第4位就不能是F。
好了,知道了原理,隨機生成中文漢字的程序也就出來了,以下就是生成4個隨機漢字的C#控制臺代碼:


3、程序代碼:



using System;
using System.Text;

namespace ConsoleApplication
{
class ChineseCode
  {
public static void Main()
{
//獲取GB2312編碼頁(表)
Encoding gb=Encoding.GetEncoding("gb2312");

//調(diào)用函數(shù)產(chǎn)生4個隨機中文漢字編碼
object[] bytes=CreateRegionCode(4);

//根據(jù)漢字編碼的字節(jié)數(shù)組解碼出中文漢字
string str1=gb.GetString((byte[])Convert.ChangeType(bytes[0], typeof(byte[])));
string str2=gb.GetString((byte[])Convert.ChangeType(bytes[1], typeof(byte[])));
string str3=gb.GetString((byte[])Convert.ChangeType(bytes[2], typeof(byte[])));
string str4=gb.GetString((byte[])Convert.ChangeType(bytes[3], typeof(byte[])));

//輸出的控制臺
   Console.WriteLine(str1 + str2 +str3 +str4);
   }


/**//*
此函數(shù)在漢字編碼范圍內(nèi)隨機創(chuàng)建含兩個元素的十六進(jìn)制字節(jié)數(shù)組,每個字節(jié)數(shù)組代表一個漢字,并將
四個字節(jié)數(shù)組存儲在object數(shù)組中。
參數(shù):strlength,代表需要產(chǎn)生的漢字個數(shù)
*/
public static object[] CreateRegionCode(int strlength)
{
//定義一個字符串?dāng)?shù)組儲存漢字編碼的組成元素
string[] rBase=new String [16]{"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};

Random rnd=new Random();

//定義一個object數(shù)組用來
object[] bytes=new object[strlength];

/**//*每循環(huán)一次產(chǎn)生一個含兩個元素的十六進(jìn)制字節(jié)數(shù)組,并將其放入bject數(shù)組中
每個漢字有四個區(qū)位碼組成
區(qū)位碼第1位和區(qū)位碼第2位作為字節(jié)數(shù)組第一個元素
區(qū)位碼第3位和區(qū)位碼第4位作為字節(jié)數(shù)組第二個元素
*/
for(int i=0;i {
//區(qū)位碼第1位
int r1=rnd.Next(11,14);
string str_r1=rBase[r1].Trim();

//區(qū)位碼第2位
rnd=new Random(r1*unchecked((int)DateTime.Now.Ticks)+i);//更換隨機數(shù)發(fā)生器的

種子避免產(chǎn)生重復(fù)值
int r2;
if (r1==13)
{
r2=rnd.Next(0,7);
}
else
{
r2=rnd.Next(0,16);
}
string str_r2=rBase[r2].Trim();

//區(qū)位碼第3位
rnd=new Random(r2*unchecked((int)DateTime.Now.Ticks)+i);
int r3=rnd.Next(10,16);
string str_r3=rBase[r3].Trim();

//區(qū)位碼第4位
rnd=new Random(r3*unchecked((int)DateTime.Now.Ticks)+i);
int r4;
if (r3==10)
{
r4=rnd.Next(1,16);
}
else if (r3==15)
{
r4=rnd.Next(0,15);
}
else
{
r4=rnd.Next(0,16);
}
string str_r4=rBase[r4].Trim();

//定義兩個字節(jié)變量存儲產(chǎn)生的隨機漢字區(qū)位碼
byte byte1=Convert.ToByte(str_r1 + str_r2,16);
byte byte2=Convert.ToByte(str_r3 + str_r4,16);
//將兩個字節(jié)變量存儲在字節(jié)數(shù)組中
byte[] str_r=new byte[]{byte1,byte2};

//將產(chǎn)生的一個漢字的字節(jié)數(shù)組放入object數(shù)組中
bytes.SetValue(str_r,i);

}

return bytes;

}
  }

}


實現(xiàn)了隨機生成漢字后,就可以使用.NET GDI來繪制自己需要的驗證碼圖形了。具體的怎樣生成驗證碼圖片,以及改變其中字符的長和寬等效果網(wǎng)上已經(jīng)有很多相關(guān)的文章,這里由于篇幅就不再介紹了。不過有一點要說明的是以上代碼在中文版的Windows下才能運行,因為它帶有GB的字符集,如果你是其他語言的操作系統(tǒng),就需要安裝GB字符集了。

有什么問題可以到 http://www.cnblogs.com/navicy/ 發(fā)表看法。
http://navicy.126.com









用.NET獲取漢字的區(qū)位碼(C#)


http://dev.csdn.net/article/58/58359.shtm

首先復(fù)習(xí)一下計算機基礎(chǔ)知識:

  計算機中最底層的數(shù)據(jù)都是用二進(jìn)制及0和1來表示的。每個0或1稱作1位,第8位二進(jìn)制數(shù)叫做1個字節(jié),它可以表示ASCII碼中的一個字符。中文計算機中用兩個字節(jié)即16位二進(jìn)制來表示一個漢字。而在Unicode編碼中所有的符號(包括漢字,英文,標(biāo)題及其它眾多符號)都是為兩字節(jié)(16)位來表示。

  在System.Text命名空間中包含眾多編碼的類,可供進(jìn)行操作及轉(zhuǎn)換,下面用兩個實例來進(jìn)行區(qū)位碼及漢字之間的互換,希望能起到舉一反三的效果,讓大家可以輕松處理文字編碼方面的問題:

程序代碼:

  using System;
  using System.Text;
  class CodingChange
  {
  public string CharacterToCoding(string character)
  {
  string coding = "";
  for (int i = 0; i  {
  byte[] bytes = System.Text.Encoding.Unicode.GetBytes(character.Substring(i,1)); //取出二進(jìn)制編碼內(nèi)容
  string lowCode = System.Convert.ToString(bytes[0], 16); //取出低字節(jié)編碼內(nèi)容(兩位16進(jìn)制)
  if (lowCode.Length == 1)
  lowCode = "0" + lowCode;
  string hightCode = System.Convert.ToString(bytes[1], 16);//取出高字節(jié)編碼內(nèi)容(兩位16進(jìn)制)
  if (hightCode.Length == 1)
  hightCode = "0" + hightCode;
  coding += (lowCode + hightCode);//加入到字符串中,
  }
  return coding;
  }
  public string CodingToCharacter(string coding)
  {
  string characters = "";

轉(zhuǎn)自:http://www.guoblog.com/blogview.asp?logID=201

作者Blog:http://blog.csdn.net/AppleBBS/












2進(jìn)制、8進(jìn)制、10進(jìn)制、16進(jìn)制...各種進(jìn)制間的輕松轉(zhuǎn)換(c#)


http://blog.csdn.net/gztoby/archive/2004/08/16/76293.aspx

在.NET Framework中,System.Convert類中提供了較為全面的各種類型、數(shù)值之間的轉(zhuǎn)換功能。其中的兩個方法可以輕松的實現(xiàn)各種進(jìn)制的數(shù)值間的轉(zhuǎn)換:

Convert.ToInt32(string value, int fromBase):

可以把不同進(jìn)制數(shù)值的字符串轉(zhuǎn)換為數(shù)字,其中fromBase參數(shù)為進(jìn)制的格式,只能是2、8、10及16:

如Convert.ToInt32(”0010”,2)執(zhí)行的結(jié)果為2;

Convert.ToString(int value, int toBase):

可以把一個數(shù)字轉(zhuǎn)換為不同進(jìn)制數(shù)值的字符串格式,其中toBase參數(shù)為進(jìn)制的格式,只能是2、8、10及16:

如Convert.ToString(2,2)執(zhí)行的結(jié)果為”0010”

現(xiàn)在我們做一個方法實現(xiàn)各種進(jìn)制間的字符串自由轉(zhuǎn)換:選把它轉(zhuǎn)成數(shù)值型,然后再轉(zhuǎn)成相應(yīng)的進(jìn)制的字符串:

public string ConvertString(string value, int fromBase, int toBase)

{

int intValue = Convert.ToInt32(value, fromBase);

return Convert.ToString(intValue, toBase);
}

其中fromBase為原來的格式

toBase為將要轉(zhuǎn)換成的格式

yolle [原作]
????????????

再分享一下我老師大神的人工智能教程吧。零基礎(chǔ)!通俗易懂!風(fēng)趣幽默!還帶黃段子!希望你也加入到我們?nèi)斯ぶ悄艿年犖橹衼?#xff01;https://blog.csdn.net/jiangjunshow

總結(jié)

以上是生活随笔為你收集整理的汉字区位码查询与算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。