真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

c語(yǔ)言iconv函數(shù)詳解 iconv函數(shù)參數(shù)

C語(yǔ)言 初學(xué)者,請(qǐng)大神詳解下下面兩個(gè)函數(shù)參數(shù)的區(qū)別,什么用途?我是新手,請(qǐng)耐心解答下,虛心求教!

char * const cp : 定義一個(gè)指向字符的指針常數(shù),即const指針。就是指針本身的值是不可變的。

在霍林郭勒等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),網(wǎng)絡(luò)營(yíng)銷推廣,外貿(mào)網(wǎng)站制作,霍林郭勒網(wǎng)站建設(shè)費(fèi)用合理。

const char* p : 定義一個(gè)指向字符常數(shù)的指針。就是指針指向的內(nèi)容是不可變的。

用linux c語(yǔ)言編寫 為一個(gè)文件里面的內(nèi)容的每一行添加一個(gè)指定的字符

1、基本思路:從第一個(gè)文本文件中用

fgets()

函數(shù)讀出一行數(shù)據(jù),對(duì)讀出的每一行數(shù)據(jù)進(jìn)行判斷,如果需要在它的適當(dāng)位置插入一行,把相應(yīng)的新內(nèi)容、以及該行的內(nèi)容寫到第二個(gè)文本文件中。如果不需要在該位置插入一行,那就直接將該行數(shù)據(jù)用

fprintf()

函數(shù)寫入第二個(gè)文本文件中。

2、偽代碼:

1.打開要修改的文件A,

2.創(chuàng)建一個(gè)臨時(shí)文件B,

3.

while(沒到達(dá)文件A末尾)

從A中讀取一行,寫到B中,然后寫入要追加的內(nèi)容,寫入換行符

4.關(guān)閉文件A,關(guān)閉文件B,

5.刪除文件A(用remove函數(shù)),重命名B為A(用rename函數(shù))

常常聽人說"編碼".怎么解釋.?

coding

編碼定義

編碼是根據(jù)一定的協(xié)議或格式把模擬信息轉(zhuǎn)換成比特流的過程。

在計(jì)算機(jī)硬件中,編碼(coding)是在一個(gè)主題或單元上為數(shù)據(jù)存儲(chǔ),管理和分析的目的而轉(zhuǎn)換信息為編碼值(典型地如數(shù)字)的過程。在軟件中,編碼意味著邏輯地使用一個(gè)特定的語(yǔ)言如C或C++來執(zhí)行一個(gè)程序。在密碼學(xué)中,編碼是指在編碼或密碼中寫的行為。

將數(shù)據(jù)轉(zhuǎn)換為代碼或編碼字符,并能譯為原數(shù)據(jù)形式。是計(jì)算機(jī)書寫指令的過程,程序設(shè)計(jì)中的一部分。在地圖自動(dòng)制圖中,按一定規(guī)則用數(shù)字與字母表示地圖內(nèi)容的過程,通過編碼,使計(jì)算機(jī)能識(shí)別地圖的各地理要素。

n位二進(jìn)制數(shù)可以組合成2n個(gè)不同的信息,給每個(gè)信息規(guī)定一個(gè)具體碼組,這種過程也叫編碼。

數(shù)字系統(tǒng)中常用的編碼有兩類,一類是二進(jìn)制編碼,另一類是二—十進(jìn)制編碼。

漢字的編碼體系

1.ASCII與Binary

我們?nèi)粘=佑|到的文件分ASCII和Binary兩種。ASCII是“美國(guó)信息交換標(biāo)準(zhǔn)編碼”的英文字頭縮寫,可稱之為“美標(biāo)”。美標(biāo)規(guī)定了用從0到127的128個(gè)數(shù)字來代表信息的規(guī)范編碼,其中包括33個(gè)控制碼,一個(gè)空格碼,和94個(gè)形象碼。形象碼中包括了英文大小寫字母,阿拉伯?dāng)?shù)字,標(biāo)點(diǎn)符號(hào)等。我們平時(shí)閱讀的英文電腦文本,就是以形象碼的方式傳遞和存儲(chǔ)的。美標(biāo)是國(guó)際上大部分大小電腦的通用編碼。

然而電腦中的一個(gè)字符大都是用一個(gè)八位數(shù)的二進(jìn)制數(shù)字表示。這樣每一字符便可能有256個(gè)不同的數(shù)值。由于美標(biāo)只規(guī)定了128個(gè)編碼,剩下的另外128個(gè)數(shù)碼沒有規(guī)范,各家用法不一。另外美標(biāo)中的33個(gè)控制碼,各廠家用法也不盡一致。這樣我們?cè)诓煌娔X間交換文件的時(shí)候,就有必要區(qū)分兩類不同的文件。第一類文件中每一個(gè)字都是美標(biāo)形象碼或空格碼。這類文件稱為“美標(biāo)文本文件”(ASCII Text Files),或略為“文本文件”,通??稍诓煌娔X系統(tǒng)間直接交換。第二類文件,也就是含有控制碼或非美標(biāo)碼的文件,通常不能在不同電腦系統(tǒng)間直接交換。這類文件有一個(gè)通稱,叫“二進(jìn)制文件”(Binary Files)。

2.國(guó)標(biāo)、區(qū)位、“準(zhǔn)國(guó)標(biāo)”

“國(guó)標(biāo)”是“中華人民共和國(guó)國(guó)家標(biāo)準(zhǔn)信息交換用漢字編碼”的簡(jiǎn)稱。國(guó)標(biāo)表(基本表)把七千余漢字、以及標(biāo)點(diǎn)符號(hào)、外文字母等,排成一個(gè)94行、94列的方陣。方陣中每一橫行叫一個(gè)“區(qū)”,每個(gè)區(qū)有九十四個(gè)“位”。一個(gè)漢字在方陣中的坐標(biāo),稱為該字的“區(qū)位碼”。例如“中”字在方陣中處于第54區(qū)第48位,它的區(qū)位碼就是5448。

其實(shí)94這個(gè)數(shù)字。它是美標(biāo)中形象碼的總數(shù)。國(guó)標(biāo)表沿用這個(gè)數(shù)字,本意大概是要用兩個(gè)美標(biāo)形象符代表一個(gè)漢字。由于美標(biāo)形象符的編碼是從33到126,漢字區(qū)、位碼如果各加上32,就會(huì)與美標(biāo)形象碼的范圍重合。如上例“中”字區(qū)、位碼加上32后,得86,80。這兩個(gè)數(shù)字的十六進(jìn)制放在一起得5650,稱為該字的“國(guó)標(biāo)碼”,而與其相對(duì)應(yīng)的兩個(gè)美標(biāo)符號(hào),VP,也就是“中”字的“國(guó)標(biāo)符”了。

這樣就產(chǎn)生了一個(gè)如何區(qū)分國(guó)標(biāo)符與美標(biāo)符的問題。在一個(gè)中英文混用的文件里,“VP”到底代表“中”字呢,還是代表某個(gè)英文字頭縮寫?電子工業(yè)部第六研究所開發(fā)CCDOS的時(shí)候,使用了一個(gè)簡(jiǎn)便的解決方案:把國(guó)標(biāo)碼的兩個(gè)數(shù)字各加上128,上升到非美標(biāo)碼的位置。(改變后的國(guó)標(biāo)碼,習(xí)慣上仍叫“國(guó)標(biāo)”。)

這個(gè)方案固然解決了原來的問題,可是新的問題隨之產(chǎn)生。中文文件成了“二進(jìn)制文件”,既不能可靠地在不同電腦系統(tǒng)間交換,也不與市場(chǎng)上大部分以美標(biāo)符號(hào)為設(shè)計(jì)對(duì)象的軟件兼容。

為了區(qū)分以上兩種“國(guó)標(biāo)”,我們把原與美標(biāo)形象碼重合的國(guó)標(biāo)碼稱為“純國(guó)標(biāo)” ,而把CCDOS加上128的國(guó)標(biāo)碼稱為“準(zhǔn)國(guó)標(biāo)”。

3.GBK碼:

GBK碼是GB碼的擴(kuò)展字符編碼,對(duì)多達(dá)2萬多的簡(jiǎn)繁漢字進(jìn)行了編碼,簡(jiǎn)體版的Win95和Win98都是使用GBK作系統(tǒng)內(nèi)碼。

從實(shí)際運(yùn)用來看,微軟自win95簡(jiǎn)體中文版開始,系統(tǒng)就采用GBK代碼,它包括了TrueType宋體、黑體兩種GBK字庫(kù)(北京中易電子公司提供),可以用于顯示和打印,并提供了四種GBK漢字的輸入法。此外,瀏覽器IE4.0簡(jiǎn)體、繁體中文版內(nèi)部提供了一個(gè)GBK-BIG5代碼雙向轉(zhuǎn)換功能。此外,微軟公司為IE提供的語(yǔ)言包中,簡(jiǎn)體中文支持(Simplified Chinese Language Support Kit)的兩種字庫(kù)宋體、黑體,也是GBK漢字(珠海四通電腦排版系統(tǒng)開發(fā)公司提供)。其他一些中文字庫(kù)生產(chǎn)廠商,也開始提供TrueType或PostScript GBK字庫(kù)。

許多外掛式的中文平臺(tái),如南極星、四通利方(Richwin)等,提供GBK碼的支持,包括字庫(kù)、輸入法和GBK與其他中文代碼的轉(zhuǎn)化器。

互聯(lián)網(wǎng)方面,許多網(wǎng)站網(wǎng)頁(yè)使用GBK代碼。

但是多數(shù)搜索引擎都不能很好的支持GBK漢字搜索,大陸地區(qū)的搜索引擎有些能不完善的支持GBK漢字檢索。

其實(shí),GBK是又一個(gè)漢字編碼標(biāo)準(zhǔn),全稱《漢字內(nèi)碼擴(kuò)展規(guī)范》(Chinese Internatial Code Specification),1995年頒布。GB是國(guó)標(biāo),K是漢字“擴(kuò)展”的漢語(yǔ)拼音第一個(gè)字母。

GBK向下與GB-2312編碼兼容,向上支持ISO 10646.1國(guó)際標(biāo)準(zhǔn),是前者向后者過渡的一個(gè)承啟標(biāo)準(zhǔn)。

GBK規(guī)范收錄了ISO 10646.1中的全部CJK漢字和符號(hào),并有所補(bǔ)充。具體包括:GB 2312中的全部漢字、非漢字符號(hào);GB 13000.1中的其他CJK漢字。以上合計(jì)20902個(gè)GB化漢字;《簡(jiǎn)化總表中》未收入GB 13000.1的52個(gè)漢字;《康熙字典》以及《辭?!分形幢皇杖隚B 13000.1的28個(gè)部首及重要構(gòu)件;13個(gè)漢字結(jié)構(gòu)符;BIG-5中未被GB 2312收入、但存在于GB 13000.1的139個(gè)圖形符號(hào);GB 12345增補(bǔ)的6個(gè)拼音符號(hào);GB 12345增補(bǔ)的19個(gè)豎排圖形符號(hào)(GB 12345較GB 2312增補(bǔ)豎排標(biāo)點(diǎn)符號(hào)29個(gè),其中10個(gè)未被GB 13000.1收入,故GBK亦不收);從GB 13000.1的CJK兼容區(qū)挑選出的21個(gè)漢字;GB 13000.1收入的31個(gè)IBM OS/2專用符號(hào)。GBK亦采用雙字節(jié)表示,總體編碼范圍為0x8140~0xFEFE之間,首字節(jié)在0x81~0xFE之間,尾字節(jié)在0x40~0xFE之間,剔除0x××7F一條線,總計(jì)23940個(gè)碼位,共收入21886個(gè)漢字和圖形符號(hào),其中漢字(包括部首和構(gòu)件)21003個(gè),圖形符號(hào)883個(gè)。

4.BIG5碼:

BIG5碼是針對(duì)繁體漢字的漢字編碼,目前在臺(tái)灣、香港的電腦系統(tǒng)中得到普遍應(yīng)用。BIG5碼的編碼范圍參考下文。

5.HZ碼:

HZ碼是在Internet上廣泛使用的一種漢字編碼?!癏Z”方案的特點(diǎn),是以“純國(guó)標(biāo)”的中文與美標(biāo)碼混用。那么“HZ”是怎樣區(qū)分國(guó)標(biāo)符和美標(biāo)符的呢?答案其實(shí)也很簡(jiǎn)單:當(dāng)一串美標(biāo)碼中間插入一段國(guó)標(biāo)碼的時(shí)候,我們便在國(guó)標(biāo)碼的前面加上~,后面加上~。這些附加碼分別叫“逃出碼”和“逃入碼”。 由于這些附加碼本身也是美標(biāo)形象碼,整個(gè)文件就儼然是一個(gè)美標(biāo)文本文件,可以安然地 在電腦網(wǎng)上傳遞,也和大部分英文文本處理軟件兼容。

6.ISO-2022CJK碼:

ISO-2022是國(guó)際標(biāo)準(zhǔn)組織(ISO)為各種語(yǔ)言字符制定的編碼標(biāo)準(zhǔn)。采用二個(gè)字節(jié)編碼,其中漢語(yǔ)編碼稱ISO-2022 CN,日語(yǔ)、韓語(yǔ)的編碼分別稱JP、KR。一般將三者合稱CJK碼。目前CJK碼主要在Internet網(wǎng)絡(luò)中使用。

7.UCS 和 ISO 10646:

1993年,國(guó)際標(biāo)準(zhǔn)ISO10646 定義了通用字符集 (Universal Character Set, UCS)。 UCS 是所有其他字符集標(biāo)準(zhǔn)的一個(gè)超集。它保證與其他字符集是雙向兼容的。就是說, 如果你將任何文本字符串翻譯到 UCS格式,然后再翻譯回原編碼, 你不會(huì)丟失任何信息。

UCS 包含了用于表達(dá)所有已知語(yǔ)言的字符。不僅包括拉丁語(yǔ),希臘語(yǔ),斯拉夫語(yǔ),希伯來語(yǔ),阿拉伯語(yǔ),亞美尼亞語(yǔ)和喬治亞語(yǔ)的描述, 還包括中文,日文和韓文這樣的象形文字,以及平假名,片假名,孟加拉語(yǔ), 旁遮普語(yǔ)果魯穆奇字符(Gurmukhi), 泰米爾語(yǔ), 印.埃納德語(yǔ)(Kannada),Malayalam,泰國(guó)語(yǔ), 老撾語(yǔ), 漢語(yǔ)拼音(Bopomofo), Hangul,Devangari,Gujarati, Oriya,Telugu 以及其它語(yǔ)種。對(duì)于還沒有加入的語(yǔ)言, 由于正在研究怎樣在計(jì)算機(jī)中最好地編碼它們, 因而最終它們都將被加入。這些語(yǔ)言包括Tibetian,高棉語(yǔ),Runic(古代北歐文字),埃塞俄比亞語(yǔ), 其他象形文字,以及各種各樣的印-歐語(yǔ)系的語(yǔ)言,還包括挑選出來的藝術(shù)語(yǔ)言比如 Tengwar,Cirth 和 克林貢語(yǔ)(Klingon)。UCS 還包括大量的圖形的,印刷用的,數(shù)學(xué)用的和科學(xué)用的符號(hào),包括所有由 TeX,Postscript, MS-DOS,MS-Windows, Macintosh, OCR 字體, 以及許多其他字處理和出版系統(tǒng)提供的字符。

ISO 10646 定義了一個(gè) 31 位的字符集。 然而, 在這巨大的編碼空間中, 迄今為止只分配了前 65534 個(gè)碼位 (0x0000 到 0xFFFD)。這個(gè)UCS的16位子集稱為基本多語(yǔ)言面 (Basic Multilingual Plane, BMP)。 將被編碼在16位BMP以外的字符都屬于非常特殊的字符(比如象形文字), 且只有專家在歷史和科學(xué)領(lǐng)域里才會(huì)用到它們。按當(dāng)前的計(jì)劃, 將來也許再也不會(huì)有字符被分配到從0x000000到0x10FFFF這個(gè)覆蓋了超過100萬個(gè)潛在的未來字符的 21 位的編碼空間以外去了。ISO 10646-1標(biāo)準(zhǔn)第一次發(fā)表于1993年, 定義了字符集與 BMP 中內(nèi)容的架構(gòu)。定義 BMP以外的字符編碼的第二部分 ISO 10646-2 正在準(zhǔn)備中, 但也許要過好幾年才能完成。新的字符仍源源不斷地加入到 BMP 中, 但已經(jīng)存在的字符是穩(wěn)定的且不會(huì)再改變了。

UCS 不僅給每個(gè)字符分配一個(gè)代碼, 而且賦予了一個(gè)正式的名字。表示一個(gè) UCS 或 Unicode 值的十六進(jìn)制數(shù), 通常在前面加上 “U+”, 就象U+0041 代表字符“拉丁大寫字母A”。UCS字符U+0000到U+007F 與 US-ASCII(ISO 646) 是一致的, U+0000 到 U+00FF 與 ISO 8859-1(Latin-1) 也是一致的。從 U+E000 到 U+F8FF,已經(jīng)BMP 以外的大范圍的編碼是為私用保留的。

1993年,ISO10646中定義的USC-4 (Universal Character Set) ,使用了4 個(gè)字節(jié)的寬度以容納足夠多的相當(dāng)可觀的空間,但是這個(gè)過于肥胖的字符標(biāo)準(zhǔn)在當(dāng)時(shí)乃至現(xiàn)在都有其不現(xiàn)實(shí)的一面,就是會(huì)過分侵占存儲(chǔ)空間并影響信息傳輸?shù)男省?與此同時(shí),Unicode 組織于約 10 年前以 Universal, Unique和Uniform 為主旨也開始開發(fā)一個(gè)16位字符標(biāo)準(zhǔn), 為避免兩種16位編碼的競(jìng)爭(zhēng),1992年兩家組織開始協(xié)商,以期折衷尋找共同點(diǎn),這就是今天的 UCS-2 (BMP,Basic Multilingual Plane,16bit) 和Unicode,但它們?nèi)匀皇遣煌姆桨浮?/p>

8.Unicode碼:

關(guān)于Unicode我們需要追溯一下它產(chǎn)生的源源。

當(dāng)計(jì)算機(jī)普及到東亞時(shí),遇到了使用表意字符而非字母語(yǔ)言的中、日、韓等國(guó)家。在這些國(guó)家使用的語(yǔ)言中常用字符多達(dá)幾千個(gè),而原來字符采用的是單字節(jié)編碼,一張代碼頁(yè)中最多容納的字符只有28=256個(gè),對(duì)于使用表意字符的語(yǔ)言是在無能為力。既然一個(gè)字節(jié)不夠,自然人們就采用兩個(gè)字節(jié),所有出現(xiàn)了使用雙字節(jié)編碼的字符集(DBCS)。不過雙字節(jié)字符集中雖然表意字符使用了兩個(gè)字節(jié)編碼,但其中的ASCII碼和日文片假名等仍用單字節(jié)表示,如此一來給程序員帶來了不小的麻煩,因?yàn)槊慨?dāng)設(shè)計(jì)到DBCS字符串的處理時(shí),總是要判斷當(dāng)中的一個(gè)字節(jié)到底表示的是一個(gè)字符還是半個(gè)字符,如果是半個(gè)字符,那是前一半還是后一半?由此可見DBCS并不是一種非常好的解決方案。

人們?cè)诓粩鄬ふ疫@更好的字符編碼方案,最后的結(jié)果就是Unicode誕生了。Unicode其實(shí)就是寬字節(jié)字符集,它對(duì)每個(gè)字符都固定使用兩個(gè)字節(jié)即16位表示,于是當(dāng)處理字符時(shí),不必?fù)?dān)心只處理半個(gè)字符。

目前,Unicode在網(wǎng)絡(luò)、Windows系統(tǒng)和很多大型軟件中得到應(yīng)用。

關(guān)于GB編碼的一些常識(shí)

GB編碼標(biāo)準(zhǔn)中,比較常用的是GB2312和GBK兩種,GB2312是GBK的一個(gè)子集,GB2312編碼范圍是 0xA1A1 - 0xFEFE ,如果純粹的 GB2312編碼,處理起來是什分簡(jiǎn)單的,但處理GBK字符集時(shí)有些小的提示,先說說GBK編碼的標(biāo)準(zhǔn)吧:

GBK 采用雙字節(jié)表示,總體編碼范圍為 8140-FEFE,首字節(jié)在 81-FE 之間,尾字節(jié)在 40-FE 之間,剔除 xx7F 一條線??傆?jì) 23940 個(gè)碼位,共收入 21886 個(gè)漢字和圖形符號(hào),其中漢字(包括部首和構(gòu)件)21003 個(gè),圖形符號(hào) 883 個(gè)。

全部編碼分為三大部分:

1. 漢字區(qū)。包括:

a. GB 2312 漢字區(qū)。即 GBK/2: B0A1-F7FE。收錄 GB 2312 漢字 6763 個(gè),按原順序排列。

b. GB 13000.1 擴(kuò)充漢字區(qū)。包括:

(1) GBK/3: 8140-A0FE。收錄 GB 13000.1 中的 CJK 漢字 6080 個(gè)。

(2) GBK/4: AA40-FEA0。收錄 CJK 漢字和增補(bǔ)的漢字 8160 個(gè)。

CJK 漢字在前,按 UCS 代碼大小排列;增補(bǔ)的漢字(包括部首和構(gòu)件)在后,按《康熙字典》的頁(yè)碼/字位排列。

2. 圖形符號(hào)區(qū)。包括:

a. GB 2312 非漢字符號(hào)區(qū)。即 GBK/1: A1A1-A9FE。其中除 GB 2312 的符號(hào)外,

還有 10 個(gè)小寫羅馬數(shù)字和 GB 12345 增補(bǔ)的符號(hào)。計(jì)符號(hào) 717 個(gè)。

b. GB 13000.1 擴(kuò)充非漢字區(qū)。即 GBK/5: A840-A9A0。BIG-5 非漢字符號(hào)、結(jié)構(gòu)符和“○”排列在此區(qū)。計(jì)符號(hào) 166 個(gè)。

3. 用戶自定義區(qū):分為(1)(2)(3)三個(gè)小區(qū)。

(1) AAA1-AFFE,碼位 564 個(gè)。

(2) F8A1-FEFE,碼位 658 個(gè)。

(3) A140-A7A0,碼位 672 個(gè)。

第(3)區(qū)盡管對(duì)用戶開放,但限制使用,因?yàn)椴慌懦磥碓诖藚^(qū)域增補(bǔ)新字符的可能性。

這里有幾個(gè)小技巧:

一、在php中,字符編碼是按所發(fā)送的編碼為準(zhǔn)的,因些使用的就是用戶輸入的編碼,不會(huì)自動(dòng)改變,但在asp中,默認(rèn)的編碼是unicode,這樣我們很容易就能得到gbk-unicode的編碼對(duì)照表,這樣即使在毫無基礎(chǔ)庫(kù)的情況下也能很容易的實(shí)現(xiàn)gbk到utf-8的轉(zhuǎn)換了;

二、由于GBK是高位最低數(shù)值是0x40,即是64,因此,有時(shí)候組織一些涉及中文的字串時(shí),分割字符最好用64之前的ascii碼,這樣在任意情況下替換或分割都不會(huì)出現(xiàn)亂碼,比較常用的是 ","、";"、":"、" "、" "、" ",這些字符永遠(yuǎn)都不會(huì)給gb編碼添亂。

字符集編碼轉(zhuǎn)換輕松實(shí)現(xiàn)

一、利用iconv函數(shù)族進(jìn)行編碼轉(zhuǎn)換

在LINUX上進(jìn)行編碼轉(zhuǎn)換時(shí),既可以利用iconv函數(shù)族編程實(shí)現(xiàn),也可以利用iconv命令來實(shí)現(xiàn),只不過后者是針對(duì)文件的,即將指定文件從一種編碼轉(zhuǎn)換為另一種編碼。

iconv函數(shù)族的頭文件是iconv.h,使用前需包含之。

#include iconv.h

iconv函數(shù)族有三個(gè)函數(shù),原型如下:

(1) iconv_t iconv_open(const char *tocode, const char *fromcode);

此函數(shù)說明將要進(jìn)行哪兩種編碼的轉(zhuǎn)換,tocode是目標(biāo)編碼,fromcode是原編碼,該函數(shù)返回一個(gè)轉(zhuǎn)換句柄,供以下兩個(gè)函數(shù)使用。

(2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);

此函數(shù)從inbuf中讀取字符,轉(zhuǎn)換后輸出到outbuf中,inbytesleft用以記錄還未轉(zhuǎn)換的字符數(shù),outbytesleft用以記錄輸出緩沖的剩余空間。 (3) int iconv_close(iconv_t cd);

此函數(shù)用于關(guān)閉轉(zhuǎn)換句柄,釋放資源。

例子1: 用C語(yǔ)言實(shí)現(xiàn)的轉(zhuǎn)換示例程序

/* f.c :代碼轉(zhuǎn)換示例C程序 */

#include iconv.h

#define OUTLEN 255

main()

{

char *in_utf8 = "姝e?ㄥ??瑁?";

char *in_gb2312 = "正在安裝";

char out[OUTLEN];

//unicode碼轉(zhuǎn)為gb2312碼

rc = u2g(in_utf8,strlen(in_utf8),out,OUTLEN);

printf("unicode--gb2312 out=%sn",out);

//gb2312碼轉(zhuǎn)為unicode碼

rc = g2u(in_gb2312,strlen(in_gb2312),out,OUTLEN);

printf("gb2312--unicode out=%sn",out);

}

//代碼轉(zhuǎn)換:從一種編碼轉(zhuǎn)為另一種編碼

int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen)

{

iconv_t cd;

int rc;

char **pin = inbuf;

char **pout = outbuf;

cd = iconv_open(to_charset,from_charset);

if (cd==0) return -1;

memset(outbuf,0,outlen);

if (iconv(cd,pin,inlen,pout,outlen)==-1) return -1;

iconv_close(cd);

return 0;

}

//UNICODE碼轉(zhuǎn)為GB2312碼

int u2g(char *inbuf,int inlen,char *outbuf,int outlen)

{

return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);

}

//GB2312碼轉(zhuǎn)為UNICODE碼

int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)

{

return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen);

}

例子2: 用C++語(yǔ)言實(shí)現(xiàn)的轉(zhuǎn)換示例程序

/* f.cpp : 代碼轉(zhuǎn)換示例C++程序 */

#include iconv.h

#include iostream

#define OUTLEN 255

using namespace std;

// 代碼轉(zhuǎn)換操作類

class CodeConverter {

private:

iconv_t cd;

public:

// 構(gòu)造

CodeConverter(const char *from_charset,const char *to_charset) {

cd = iconv_open(to_charset,from_charset);

}

// 析構(gòu)

~CodeConverter() {

iconv_close(cd);

}

// 轉(zhuǎn)換輸出

int convert(char *inbuf,int inlen,char *outbuf,int outlen) {

char **pin = inbuf;

char **pout = outbuf;

memset(outbuf,0,outlen);

return iconv(cd,pin,(size_t *)inlen,pout,(size_t *)outlen);

}

};

int main(int argc, char **argv)

{

char *in_utf8 = "姝e?ㄥ??瑁?";

char *in_gb2312 = "正在安裝";

char out[OUTLEN];

// utf-8--gb2312

CodeConverter cc = CodeConverter("utf-8","gb2312");

cc.convert(in_utf8,strlen(in_utf8),out,OUTLEN);

cout "utf-8--gb2312 in=" in_utf8 ",out=" out endl;

// gb2312--utf-8

CodeConverter cc2 = CodeConverter("gb2312","utf-8");

cc2.convert(in_gb2312,strlen(in_gb2312),out,OUTLEN);

cout "gb2312--utf-8 in=" in_gb2312 ",out=" out endl;

}

二、利用iconv命令進(jìn)行編碼轉(zhuǎn)換

在LINUX上進(jìn)行編碼轉(zhuǎn)換時(shí),既可以利用iconv函數(shù)族編程實(shí)現(xiàn),也可以利用iconv命令來實(shí)現(xiàn),只不過后者是針對(duì)文件的,即將指定文件從一種編碼轉(zhuǎn)換為另一種編碼。

iconv命令用于轉(zhuǎn)換指定文件的編碼,默認(rèn)輸出到標(biāo)準(zhǔn)輸出設(shè)備,亦可指定輸出文件。

用法: iconv [選項(xiàng)...] [文件...]

有如下選項(xiàng)可用:

輸入/輸出格式規(guī)范:

-f, --from-code=名稱 原始文本編碼

-t, --to-code=名稱 輸出編碼

信息:

-l, --list 列舉所有已知的字符集

輸出控制:

-c 從輸出中忽略無效的字符

-o, --output=FILE 輸出文件

-s, --silent 關(guān)閉警告

--verbose 打印進(jìn)度信息

-?, --help 給出該系統(tǒng)求助列表

--usage 給出簡(jiǎn)要的用法信息

-V, --version 打印程序版本號(hào)

例子:

iconv -f utf-8 -t gb2312 aaa.txt bbb.txt

這個(gè)命令讀取aaa.txt文件,從utf-8編碼轉(zhuǎn)換為gb2312編碼,其輸出定向到bbb.txt文件。

小結(jié): LINUX為我們提供了強(qiáng)大的編碼轉(zhuǎn)換工具,給我們帶來了方便。

100財(cái)富給牛逼之人!就沒人知道在linux下用c語(yǔ)言如何將漢字的unicode編碼轉(zhuǎn)化為漢字嗎?

 除了iconv命令,我們?cè)趌inux系統(tǒng)下的man page的第三節(jié)還可以看到一組iconv函數(shù)。它們分別是

iconv_t iconv_open(const char *tocode, const char *fromcode);

size_ticonv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);

int iconv_close(iconv_t cd);

iconv_open函數(shù)用來打開一個(gè)編碼轉(zhuǎn)換的流,iconv函數(shù)的作用是實(shí)際進(jìn)行轉(zhuǎn)換,iconv_close函數(shù)的作用就是關(guān)閉這個(gè)流。實(shí)際用法參見下面的例子,下面是一個(gè)將UTF-8碼轉(zhuǎn)換成GBK碼的例子,我們假設(shè)已經(jīng)有了一個(gè)uft8編碼的輸入緩沖區(qū)inbuf以及這個(gè)緩沖區(qū)的長(zhǎng)度inlen。

iconv_t cd = iconv_open( "GBK", "UTF-8");

char *outbuf = (char *)malloc(inlen * 4 );

bzero( outbuf, inlen * 4);

char *in = inbuf;

char *out = outbuf;

size_t outlen = inlen *4;

iconv(cd, in, (size_t *)inlen, out,outlen);

outlen = strlen(outbuf);

printf("%s\n",outbuf);

free(outbuf);

iconv_close(cd);

linux下C語(yǔ)言iconv字符轉(zhuǎn)換問題

#include iconv.h

size_t iconv(iconv_t cd,

char **inbuf, size_t *inbytesleft,

char **outbuf, size_t *outbytesleft);

你看函數(shù)原型, outbuf是一個(gè) char **類型

在函數(shù)手冊(cè)中:

The iconv() function converts one multibyte character at a time, and for each character conversion it increments *inbuf and decrements

*inbytesleft by the number of converted input bytes, it increments *outbuf and decrements *outbytesleft by the number of converted

output bytes

也就是說,當(dāng)你執(zhí)行過iconv以后,*outbuf所指向的內(nèi)存空間位置已經(jīng)被改掉了, 所以你任何時(shí)候去讀*outbuf, 都是讀不到任何iconv后的數(shù)據(jù)的(都在*outbuf這個(gè)指針前面放著呢)。

所以你應(yīng)該 預(yù)先備份outbuf的數(shù)據(jù),

比如 char k[1000]; char *outb = k; 執(zhí)行完iconv(t,inb,inl,outb,outl)以后,你去讀k數(shù)組就可以了。


標(biāo)題名稱:c語(yǔ)言iconv函數(shù)詳解 iconv函數(shù)參數(shù)
URL網(wǎng)址:http://weahome.cn/article/hppogg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部