處理ANSI中文字元問題

2021-04-19 00:56:41 字數 1252 閱讀 9518

今天寫文字框類,使用ansi編碼對中文處理遇到的問題,現在和大家一起分享一下,如果您覺得這個問題很菜,那你可不並看,也不要,不要出來無理批評.如果您有更深的見解,更好的方式,本人非常願意您能分享.

好進入正題,在vc中,使用指標方式儲存字串.如  char* str = "字串abc123";  這個指標長度為:字串(6個位元組)+abc123(6個位元組)=12個位元組.這時此串中有中文有英文有數字,英文數字和字元占有1個位元組,而中文佔兩個位元組.所以對中文和英文本元的處理是不同的.比如,我的文字框在按下backspace鍵後,游標的前乙個字元或文字消除,並且更新游標的位置,此操作先取游標的位置,在取文字中的字串在游標前的那個字元的指標,如我要對文字框中的str字串f進行操作"字串abc123" str[12] = 0; 這時 "字串abc12" 這樣就可實現刪除操作.

但是如果字元不是這樣的而是  "abc123字串",str[12] = 0,此時的操作就有問題,因為中文字元是兩個位元組,現在只操作了乙個位元組.那有人說了,str[11]=0; 不就行了嗎?對是這樣,就是這樣做,但是我們比需要有個判斷什麼時候要將兩個位元組清空,什麼時候只清空乙個位元組,好了,上面說的這些都是對問題的描述,也同時給有想法的人提供一點如何自已實現文字框的思路,(什麼你問我為什麼要自已實現,vc api裡面不是可以建立嗎,只要設定幾個值就ok了嗎?嗯,是啊,但是有沒有覺得那個文字框的樣式,顯示方式啊,都是很固定的嗎,即使那些樣式能夠滿足使用者需求,難到你就不想嘗試一下自已實現文字框控制項功能的快感嗎!)

繼續說怎麼設定這個判斷,ascll碼大家都知道,每乙個英文本母,數字,符號,都有他自已的ascll碼,如 小a = 97(10進製),ascll的前128就是表示的a-z,a-z,0-9,還有一些我們常用的基本符號,那中文怎麼表示呢!兩個位元組表示,第乙個位元組的高8位一事實上為1,符號區 行a1-a9 列a1-fe,漢字區: 行b0-f7 列:a1-fe 6768個漢字,那這些是什麼意思呢!那我們來看一下乙個中文在計算機中表示是怎麼表示的.比如,"浩"字: ba c6 那你問了,你怎麼知道呢!我們可以有n種方式來驗證,方法1:你可以用任何一種16進製製編器,我使用ultraedit,開啟後打上乙個中文"浩"後,按ctrl+h 檢視二進位制編碼,看看是不是ba c6 , 方法2:在vc中使用單步除錯,然後執行  char* str = "浩";後檢視 str指標的位址,然後在除錯工具欄中把 memory選項開啟,將str指標位址輸入回車後,檢視兩個連續位址,還有很多種,如果你夠狠,可以使用一些比較底層的工具,如ollydbg,debug除錯工具對可執行檔案進行除錯,找出來,好了,我們知道了漢字編碼規律,就可以根據ascll碼來意判斷了

python json中文字元處理

如果json中包含中文字元,我們將其寫入檔案中會怎樣呢?import json data with open data.json w as file file write json.dumps data,indent 2 引數indent指定縮排數。執行之後,結果如下 可以看到結果中,中文字元都變成...

C 中文字元處理

解決方案 構造三層邏輯結構 輸入層 邏輯處理層 輸出層。輸入層接收char輸入,並將其轉換為wchar.邏輯處理層在 wchar 或 wstring 的基礎上進行字串操作,此時操作最小單位為中文字元,不會再有亂碼。輸出層將wchar的結果再次轉換為char 返回給外部。這樣,對外部來說,仍然是輸入c...

hibernate mysql 中文字元問題

中文亂碼 問號 1 我的eclipse預設字符集已經是utf8了 2 mysql6的資料庫預設字符集也是utf8 3 建表的語句也表明 engine myisam character set utf8 4 某一向為人謙和,不張揚,行事低調 人品也是絕對相容utf8的!這就怪了,刪表重建 drop 資...