今天和大家分享下如何遍歷中文字符串,主要是如何打印中文字符,因為中文字符串每個字符占用不只一個字節的空間,如果我們逐個字節遍歷,會出現奇怪的結果。而UTF-8編碼寫的中文字符是有特定結構的,我們可以按照它的規則去遍歷打印。
下面是詳情:
前提:UTF-8編碼。
先看下面的代碼和運行結果:
上面代碼定義了一個9個中文的字符串,但打印size確是27,挨個字符遍歷也都是?。
這個本質是因為中文不只占用一個字節的空間,換一種方式遍歷:
因為一個中文字符不一定占用幾個字節,但它們的長度其實可以從字符的頭中讀取出來,這點可以查看UTF-8的Wiki介紹:https://en.wikipedia.org/wiki/UTF-8#Description
這里可以看到,通過Byte1的前4位就可以區分出這個字符究竟占用幾個字節,所以就有了上述的遍歷方式。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
原文標題:如何遍歷中文字符串?
文章出處:【微信號:程序喵大人,微信公眾號:程序喵大人】歡迎添加關注!文章轉載請注明出處。
相關推薦
DB Tools insert data.vi在寫入中文字符串至mysql數據庫表中時寫入失誤,誰能幫忙解決一下,謝謝。補充說明:寫入英文字符串不會出錯,更換為ACCESS或SQL Server數據庫后也能正常寫入.
發表于 08-15 17:15
本人使用的是pic18f25k20,想要定義一些中文字符串,結果定義的時候發現了一些問題,無法理解,請各位大神幫忙。直接上圖吧,定義了兩個中文字符串,第二個后面多了一些方框,不知道是什么意思,編譯的話都通過了。是不是這種定義方式對中文字
發表于 11-06 11:34
在multiedit中利用MULTIEDIT_AddKey(hMulti, GUI_KEY_BACKSPACE)可以很好的刪除光標上一個8為ascii字符,但是對于16位的中文字符就不好使,大家用的是什么辦法來刪除中文字符的呀?
發表于 09-25 04:25
C語言關于中文字符串的使用誤區背景前幾天在寫c語言代碼進行文件讀寫的時候,在處理文件中的中文詩句的過程中發現了c語言txt文本文件的中文讀取到char數組中的一些不同尋常之處,因此做一個總結。c語言
發表于 07-14 07:54
c語言漢字的存儲方式和特點是什么?C語言中文字符串的使用誤區有哪些?
發表于 10-15 06:24
怎樣去解決STM32串口打印printf發送中文字符時亂碼的問題呢?
發表于 11-30 07:40
使用printf去打印中文字符的時候出現亂碼是為什么?
發表于 12-02 07:12
前言:技術售后中,技術論壇上,經常有學習、使用Arduino的小伙伴咨詢“怎樣能讓Arduino IDE輸出中文字符串”的問題。歸根結底就是Arduino IDE使用的UTF8編碼,不支持GB編碼
發表于 12-17 11:23
應用程序: 演示如何在終端上使用 UART 輸出中文字符
BSP 版本:M451系列BSP CMSIS V3.01.003
硬件: NuTiny-EVB-M451 LQFP100 V1.3
序列
發表于 08-23 06:46
界面使用的是ucGUI原本使用GB2312編碼的中字符串可以直接讀取顯示,字庫也用FontCvt做了初始化的時候也添加了GUI_UC_SetEncodeutf8();函數
后面換成UTF-8的中文字符串
發表于 10-07 07:11
字符串的表示 隨著計算機在文字處理與信息管理中的廣泛應用, 字符串已成為最常用的數據類型之一, 許多計算機中都提供字符串操作功能, 一些計算機還給出讀寫字
發表于 10-13 17:11
?3092次閱讀
C語言教程之回文字符串,很好的C語言資料,快來學習吧。
發表于 04-25 15:49
?0次下載
PHP內置的字符串長度函數strlen無法正確處理中文字符串,它得到的只是字符串所占的字節數。對于GB2312的中文編碼,strlen得到的值是漢字個數的2倍,而對于UTF-8編碼的
發表于 02-20 14:30
?9次下載
字符串函數重寫練習:字符串比較、字符串拼接、字符串查找、字符串拷貝、內存比較、內存拷貝、內存初始化、內存比較、二維數組定義及基本使用、位運算
發表于 05-05 15:02
?2036次閱讀
字符串函數重寫練習:字符串比較、字符串拼接、字符串查找、字符串拷貝、內存比較、內存拷貝、內存初始化、內存比較、二維數組定義及基本使用、位運算
發表于 08-14 09:42
?1050次閱讀
評論