WEB开发网      濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴f閺嬩線鏌涘☉姗堝姛缂佺娀绠栭弻宥堫檨闁告挻姘ㄩ幑銏犫槈濞嗘劕顎撻梺鍛婂姇瀵爼骞栭幇顔炬/闁告挆鍕畬闂佸疇顫夐崹鍧楀箖閳哄啠鍋撻崷顓炐㈡い銉︾箞濮婂搫效閸パ€鍋撳Δ鍛;闁规崘顕ф闂佸憡娲﹂崹鎵不濞戙垺鐓曟い鎰剁稻缁€鍐┿亜鎼达紕效婵﹨娅g划娆忊枎閹冨闂備礁鎽滄慨鐢稿礉濞嗘劒绻嗛柣銏⑶圭粈瀣亜閺嶃劏澹橀柛鐐姂濮婃椽妫冨ù銈嗙⊕閹峰懘骞撻幒宥咁棜闂備礁婀遍崕銈夈€冮崱娑樼厱闁圭儤顨嗛悡鏇㈡煛閸ャ儱濡煎ù婊勭矋閵囧嫯绠涢敐鍛睄闂佸搫澶囬埀顒€纾弳鍡涙倵閿濆骸澧伴柡鍡欏█閺屟勫濞嗘垵鍩岄梺闈涙鐢帡锝炲┑瀣亗閹艰揪绲奸悽鑽ょ磽娴h娈曢柛銊ョ仢椤繒绱掑Ο璇差€撶紓浣圭☉椤戝懎鈻撻鐐╂斀妞ゆ梹鏋婚崗顒傜磼閻樿櫕宕岄柕鍡曠椤繈骞囨担鍏夋瀸濠电姷鏁告慨顓㈠磻閹捐秮褰掓晲閸モ斂鈧﹪鏌¢埀顒佺鐎n偆鍘藉┑鈽嗗灡椤戞瑩宕电€n兘鍋撶憴鍕仩闁稿氦绮鹃悘鍐⒑缂佹◤顏勵嚕閸洖鐤柣鎰暩绾惧ジ鏌涚仦鐐殤閺佸牓鎮楃憴鍕缂侇喖绻樿棟閻庨潧鎽滃Λ顖炴煙椤栧棔绀佹禒顕€鎮楀▓鍨灈闁绘牜鍘ч悾鐑芥偂鎼存ɑ顫嶅┑鈽嗗灟鐠€锕傛倵瀹曞洨纾介柛灞剧懅閸斿秵銇勯妸銉︻棞闁伙絾绻堥獮鏍ㄦ媴濮濆本鎲伴梻浣虹帛濡啴藟閹捐姹查悗锝庡枟閻撶喐淇婇妶鍌氫壕闂佺粯顨呭Λ妤呭煝閹炬緞鏃堝川椤旇瀚奸梺鑽ゅТ濞茬娀鍩€椤掑啯鐝柣蹇婂亾闂傚倷绀侀幖顐﹀箠閹邦厽鍙忛柟缁㈠枟閸嬧晠鏌i妶搴$仜濞存粌缍婇弻鐔兼倻濡偐鐣洪梺鍝勬噺缁诲牆顫忓ú顏咁棃婵炴垶鑹鹃。鍝勨攽閳藉棗浜濋柣鐔叉櫊閵嗕礁鈻庨幒鏃傛澑闂佸搫鍟崐濠氭儊閸儲鈷戞慨鐟版搐閻忓弶绻涙担鍐插椤╃兘鏌ㄩ弴鐐测偓褰掓偂閺囥垺鐓忓┑鐐茬仢閸斻倝鏌涢埡瀣ɑ妞ゃ劊鍎甸幃娆撳级閹存繍娼氭俊銈囧Х閸嬬偤鏁冮姀銈冣偓浣糕枎閹炬潙娈愰梺鍐叉惈椤戝洭鐛姀銈嗏拻闁稿本鐟︾粊鐗堛亜椤愩埄妲搁柣锝呭槻铻i柤娴嬫櫇閻撳顪冮妶鍡橆梿闁跨喆鍎茬粋宥堛亹閹烘挾鍘甸梺缁樺灦钃遍悘蹇e幖闇夋繝濠傚暟缁夌儤鎱ㄦ繝鍛仩缂佽鲸甯掕灒闁惧繘鈧稒顢橀梻鍌欑劍鐎笛兠哄澶婄柧婵炴垶绮庢禍閬嶆⒒娴e憡鍟炴繛璇х畵瀹曞綊鏌嗗鍛幈闂佺鎻梽鍕偂濞嗘挻鐓犳繛鏉戭儐濞呭懎霉閻樺磭鐭婇柍瑙勫灴閸ㄩ箖鎮欓挊澶夊垝闂備浇顕栭崰妤呫€冮崨鏉戠叀濠㈣埖鍔曠粻鎶芥煙閹屽殶鐟滄澘娲ㄧ槐鎾诲磼濞嗘垼绐楅梺鍝ュУ閻楃娀銆侀弽顓炲窛闁圭⒈鍘介弲锝夋⒑缁嬭法绠抽柛妯犲懏顐介柣鎰節缁诲棙銇勯弽銊х煂閻㈩垱绋掔换娑㈠川椤撶喎鏋犲┑顔硷功缁垶骞忛崨瀛樺仭闂侇叏绠戝▓婵堢磽閸屾瑦绁版い鏇嗗洤纾归柛顭戝櫘閸ゆ洜绱撴担璐細缂佲檧鍋撻梻浣规偠閸庮垶宕濆鍛瀺闁搞儺鍓氶埛鎴犵磼鐎n偄顕滄繝鈧幍顔剧<閻庯綆鍋呭畷宀€鈧娲忛崹浠嬪箖娴犲宸濆┑鐘插楠炴姊洪悷鏉挎倯闁伙綆浜畷瑙勭節濮橆剛鍘愰梺鍝勬储閸ㄦ椽鎮¢妷锔藉弿婵☆垰鐏濋悡鎰版煟閹捐泛鏋涢柣鎿冨亰瀹曞爼濡烽妷銉バ戠紓鍌欑椤戝牆鐣烽悽鍨潟闁圭儤姊荤壕鍏间繆椤栨繂浜归柣锝堟缁辨挻鎷呴搹鐟扮缂備浇顕ч悧鍡涙偩瀹勯偊娼ㄩ柍褜鍓氭穱濠傤潰瀹€濠冃ㄧ紓鍌欐祰妞村摜鎹㈤崼婵愭綎缂備焦蓱婵绱掑☉姗嗗剰婵炲牊鍔欏娲箹閻愭彃顬嗛梺鍛婎殔閸熷潡鎮鹃悜绛嬫晬闁绘劘灏欐鍥⒑閻熼偊鍤熷┑顕€娼ч埢鎾淬偅閸愨斁鎷虹紓鍌欑劍钃遍柍閿嬪浮閺屽秴鐣¢幍顔尖叺閻庢鍣崑濠傜暦閹烘鍊烽悗鐢登归獮鍫ユ⒒娴g懓鈻曢柡渚囧櫍瀹曟垿骞樼紒妯煎幐闂佸憡渚楅崰姘跺箠閸涱喕绻嗛柛娆忣槸婵洭鎽堕敐澶嬪仩婵炴垶甯掓晶鏌ユ煛閸屾浜鹃梻鍌氬€烽懗鍓佸垝椤栫偛绀夐柡鍥╁€i悢鍝ョ瘈闁搞儜鍐╁劒闂備胶绮弻銊╂儍濠靛缁╅柤鎭掑劘娴滄粓鏌¢崘銊﹀妞ゃ儱顦甸弻娑㈠棘鐠囨祴鍋撳┑瀣闁割偅娲橀崐鐑芥煟閹寸偍缂氶柛姗€浜跺娲传閸曨剙鍋嶉梺鍛婃煥閺堫剟寮查崼鏇ㄦ晬闁绘劕顕崢鍗炩攽閻愬弶顥滅紒缁樺笧缁粯绻濆顓犲幐闁诲繒鍋熼弲顐f櫏闁诲氦顫夊ú锕傚磻婵犲倻鏆﹂柣鏃傗拡閺佸棝鏌嶈閸撴瑩鍩㈠澶嬫櫜闁搞儮鏅濋敍婵囩箾鏉堝墽绋荤憸鏉垮暞缁傚秹鎮欓鍌滅槇闂侀潧楠忕徊鍓ф兜閻愵兙浜滈柟瀛樼箖瀹告繄绱掗鍓у笡闁靛牞缍佸畷姗€鍩¢崘銊ョ闂備浇顕х€涒晝绮欓幒鎴犲箵閻犳亽鍔庢稉宥嗘叏濡炶浜鹃梺鍝勮閸斿矂鍩ユ径濞㈢喐寰勯惂鍝ョɑ闁靛洤瀚版俊鎼佹晲閸涱厼袝闂備浇顕栭崰妤呮偡閳哄懌鈧線寮崼婵堫槹濡炪倖鎸荤换鍕矆閸曨垱鈷掗柛灞剧懄缁佺増銇勯弴鐔哄⒌鐎规洑鍗冲浠嬵敃閵堝浂妲稿┑鐘垫暩婵挳宕愭繝姘辈闁挎洖鍊归悡娆愩亜閺嶎偄浠滃ù婊呭娣囧﹪鎳犳0婵嗘闂佸疇顫夐崹鍧楀春閸曨垰绀冮柕濞у懌鍋″┑锛勫亼閸娿倝宕㈡ィ鍐ㄧ婵☆垯璀﹂崵鏇㈡偣閸ャ劎銈存俊鎻掔墦閺屾洝绠涢弴鐑嗘綌闂佸啿鎼幊蹇涙偂韫囨搩鐔嗛悹楦挎婢ф洟鏌涢弮鈧幐鎶藉蓟濞戙垹妫樻繛鍡欏亾妤旂紓鍌欐祰妞存悂骞愭繝姘闁告侗鍨抽惌娆撳箹鐎涙ɑ灏ù婊堢畺閺屾稑鈹戦崟顐㈠Б闂佹椿鍘介幐楣冨箟閹间焦鍋嬮柛顐g箘閻熴劑姊洪崫鍕靛剮缂佽埖宀稿濠氭偄閻撳海顦悷婊冪箳閺侇喖鈽夐姀锛勫幐闂佸憡渚楅崰妤呭磹閹扮増鐓涢悘鐐额嚙婵倿鏌熼鍝勨偓婵嗙暦閹烘垟妲堟慨妤€妫旂槐锟� ---闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌i幋锝呅撻柛濠傛健閺屻劑寮崼鐔告闂佺ǹ顑嗛幐鍓у垝椤撶偐妲堟俊顖氭惈缁犺鈹戦悙鍙夆枙濞存粍绮撻幃鈥斥槈閵忥紕鍘卞┑鐐村灥瀹曨剟鐛Ο姹囦簻闁哄倹瀵чˉ銏℃叏婵犲懏顏犻柟鐟板婵℃悂濡烽敂鎯х稈闂傚倷鑳堕幊鎾诲吹閺嶎厼绠柨鐕傛嫹
开发学院操作系统Linux/Unix EBCDIC 与 GBK 的字符编码及其转换 阅读

EBCDIC 与 GBK 的字符编码及其转换

 2010-09-09 00:00:00 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾剧懓顪冪€n亜顒㈡い鎰Г閹便劌顫滈崱妤€骞婄紓鍌氬€瑰銊╁箟缁嬫鍚嬮柛顐線缂冩洟姊婚崒娆戭槮婵犫偓闁秵鎯為幖娣妼缁愭鏌″搴′簽濞戞挸绉甸妵鍕冀椤愵澀娌梺缁樻尪閸庣敻寮婚敐澶婂嵆闁绘劖绁撮崑鎾诲捶椤撴稑浜炬慨妯煎亾鐎氾拷闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾剧懓顪冪€n亝鎹i柣顓炴閵嗘帒顫濋敐鍛婵°倗濮烽崑娑⑺囬悽绋挎瀬闁瑰墽绮崑鎰版煙缂佹ê绗ч柍褜鍓﹂崣鍐潖閸濆嫅褔宕惰娴犲ジ姊虹拠鑼闁煎綊绠栭幃楣冩倻閽樺鎽曢梺闈涱檧婵″洭宕㈤悽鍛娾拺閻熸瑥瀚烽崯蹇涙煕閻樺磭澧甸柕鍡楀€圭缓浠嬪川婵犲嫬骞堥梺纭呭閹活亞妲愰弴鐔哄ⅰ闂傚倷绶氬ḿ褍煤閵堝洠鍋撳顐㈠祮闁绘侗鍣i獮鎺懳旈埀顒傜不閿濆棛绡€闂傚牊绋戦弳娆徝瑰⿰鍫㈢暫闁哄矉缍佹慨鈧柍鎯版硾濠€杈ㄧ珶閺囩喓绡€婵﹩鍘鹃崢鐢告⒑缂佹ê濮﹂柛鎾村哺閹ɑ娼忛妸銈囩畾闂佸湱绮敮鐐存櫠濞戞氨纾肩紓浣贯缚濞插鈧娲栧畷顒冪亙闂佸憡鍔曢崯鐘诲礈濠靛牊宕叉繛鎴炨缚閺嗗棗鈹戦悩杈厡闁轰焦鐗滅槐鎾存媴娴犲鎽甸梺鍦嚀濞层倝鎮鹃悜钘夌闁规惌鍘介崓鐢告⒑閻熸澘鎮侀柣鎺炵畵閹骞栨担鍏夋嫽婵炶揪绲块崕銈夊吹閳ь剟姊洪幖鐐测偓鏍偋閻樿崵宓侀煫鍥ㄧ⊕閺呮悂鏌ㄩ悤鍌涘濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴f閺嬩線鏌涘☉姗堟敾闁告瑥绻戦妵鍕箻閸楃偟浠肩紓浣哄閸ㄥ爼寮诲☉銏犵疀闂傚牊绋掗悘鍫ユ倵閻熺増鍟炵紒璇插暣婵$敻宕熼姘鳖啋闁诲酣娼ч幗婊堟偩婵傚憡鈷戠痪顓炴媼濞兼劖绻涢懠顒€鏋庢い顐㈢箳缁辨帒螣閼测晜鍤岄梻渚€鈧偛鑻晶顔肩暆閿濆牆鍔垫い锔界叀閹繝濡舵径瀣帾闂佸壊鍋呯换鍐磻椤忓懐绠剧€瑰壊鍠曠花濠氬箚閻斿吋鈷戦悗鍦У閵嗗啴鏌ら崘鑼煟鐎规洘绻堥弫鍐焵椤掑嫧鈧棃宕橀鍢壯囨煕閳╁喚娈橀柣鐔稿姍濮婃椽鎮℃惔鈩冩瘣闂佺粯鐗曢妶绋跨暦閻戞ḿ绡€闁搞儜鍐ㄧギ闂備線娼ф蹇曟閺囥垹鍌ㄦい蹇撶墛閳锋垿鏌熼懖鈺佷粶闁告梹顨婇弻锟犲川椤旈敮濮囩紓浣稿€圭敮鐔妓囩€靛摜纾奸弶鍫涘妼缁楁碍绻涢悡搴g闁糕斁鍓濋幏鍛存煥鐎e灚缍楅梻鍌氬€峰ù鍥ь浖閵娾晜鍊块柨鏇炲€哥粻鏌ユ煕閵夘喖澧柡瀣╃窔閺岀喖宕滆鐢盯鏌¢崨顔藉€愰柡灞诲姂閹倝宕掑☉姗嗕紦闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾剧懓顪冪€n亜顒㈡い鎰Г閹便劌顫滈崱妤€骞婄紓鍌氬€瑰銊╁箟缁嬫鍚嬮柛顐線缂冩洟姊婚崒娆戭槮婵犫偓闁秵鎯為幖娣妼缁愭鏌″搴′簽濞戞挸绉甸妵鍕冀椤愵澀娌梺缁樻尪閸庣敻寮婚敐澶婂嵆闁绘劖绁撮崑鎾诲捶椤撴稑浜炬慨妯煎亾鐎氾拷  闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌i幋锝呅撻柛銈呭閺屻倝宕妷锔芥瘎婵炲濮靛銊ф閹捐纾兼繛鍡樺笒閸橈紕绱撴笟鍥ф珮闁搞劌鐖兼俊鎾礃椤旂厧绐涢梺鍝勵槹閸ㄥ綊宕㈠ú顏呭€垫鐐茬仢閸旀碍銇勯敂璇茬仸鐎规洩绻濋獮搴ㄦ嚍閵壯冨妇闂傚⿴鍋勫ú锕€煤閺嶃劎澧¢梻鍌欐祰椤曆呪偓鍨浮瀹曟粓鎮㈡總澶嬬稁闂佹儳绻愬﹢杈╁閸忛棿绻嗘い鏍ㄧ閹牊銇勯銏㈢劯婵﹨娅i幏鐘绘嚑椤掑偆鍞规繝娈垮枟鑿ч柛鏃€鍨垮畷娲焵椤掍降浜滈柟鍝勭Ф椤︼箓鏌涢妶搴″⒋闁哄本鐩獮妯兼崉閻戞ḿ鈧顪冮妶搴′簻缂佺粯鍔楅崣鍛渻閵堝懐绠伴悗姘煎墴閹顢橀悜鍡樺瘜闂侀潧鐗嗗Λ娆戠矆閳ь剟姊洪悷鏉挎毐闂佸府绲介悾宄扳堪閸曨偒鍤ら柣搴㈢⊕鑿ら柟閿嬫そ濮婄粯绗熼崶褌绨介梺绋款儐閻╊垶骞婇悢纰辨晬婵炴垶鐟﹂悵宄邦渻閵堝棙鐓ュ褏鏅竟鏇㈡偂鎼搭喚鍞甸柣鐘烘鐏忋劑宕濋悢铏圭<濠㈣泛瀛╅鐘绘煃瑜滈崜姘额敊閺嶎厼绐楅柡宥庡幐閳ь剨绠撻弻銊р偓锝傛櫇缁犳艾鈹戦鐣岀畵闁活厼鐗嗗嵄闁绘垼濮ら埛鎴犵磼鐎n偒鍎ラ柛搴㈠姍閺岀喖鎮烽悧鍫熸倷闁捐崵鍋ら弻娑㈠箛閳轰礁唯濠碘剝褰冮悧濠勬崲濞戙垹骞㈡俊銈呭暟椤斿鈹戦悙鑼闁挎洏鍨归~蹇曠磼濡顎撴俊鐐差儏缁ㄨ偐鎲伴崱娆戠=闁稿本姘ㄨⅵ闂佺ǹ顑嗛幐鑽ゆ崲濞戞埃鍋撳☉娆嬬細闁活厹鍊濋弻娑㈠箻鐠虹儤鐏堥悗瑙勬礃濡炰粙宕洪埀顒併亜閹哄秹妾峰ù婊勭矒閺岀喖鎮滃Ο铏逛淮闂侀€炲苯澧紓宥咃工椤曪綁骞庣粵瀣櫌闂佸憡娲﹂崜娑㈠储闁秵鐓熼幖鎼灣缁夐潧霉濠婂懎鍘撮柣鎿冨墴椤㈡宕掑Δ鈧禍楣冩偡濞嗗繐顏痪鎯ь煼閺屾稑螖閳ь剟宕崸妤婃晪闁挎繂顦壕褰掓煟閺囨氨鍔嶉棄瀣⒒閸屾瑧顦﹂柟纰卞亜铻為悗闈涙憸娑撳秹鏌熼幑鎰靛殭闁藉啰鍠栭弻鏇熺箾閻愵剚鐝曢梺绋款儏濡繈寮诲☉姘勃闁告挆鈧Σ鍫濐渻閵堝懘鐛滈柟鍑ゆ嫹
核心提示:概览有些用户在使用 AIX 时在字符编码方面遇到一些困惑,请看下面的场景:1,EBCDIC 与 GBK 的字符编码及其转换,用户用从 AIX 利用 FTP 客户端登录上 IBM i,切换到某个 Library/File,体系以及字符转换原理进行一定的学习和理解,对在涉及不同平台交换数据以及对字符进行处理时比较有帮助,然

概览

有些用户在使用 AIX 时在字符编码方面遇到一些困惑,请看下面的场景:

1,用户用从 AIX 利用 FTP 客户端登录上 IBM i,切换到某个 Library/File,然后 get 其中的某个 Member 到本地机器,用文本编辑工具打开时发现是乱码,和自己在 IBM i 上看到的完全不一样;

2,用户在实现 AIX 平台与 z/OS 平台通信的 TCP/IP 应用程序中,会遇到传送的报文内容并没有按照预想的出现。

众所周知,AIX 平台的字符编码是基于 ASCII 的,但在与非 ASCII 字符编码体系的平台通信时,就会涉及到编码转换的问题,比如 AIX 平台与 IBM i,z/OS 平台通信。由于 IBM i 和 z/OS 历史悠久,在系统的字符编码以及多国语言支持方面有其鲜明的特点,衍生出其独有的概念与体系。本文通过介绍字符编码的概念及其体系,帮助用户解决一些类似上述的问题。

字符集与字符编码

在我们的计算机世界里,字符是十分基本的元素,了解字符集,字符编码的基本特性,是解决字符识别与转换,实际开发中的字符处理(如读取,截取)等问题的基础与关键。

字符集(Character Set),顾名思义,特定字符的集合。字符集并没定义字符的顺序,排序的方法以及其他更多的特性。字符集通常只是定义了字符的名字以及字符形状的外在表现 ;

字符编码(Character Encoding),在定义好的字符集基础上,设计出一种方法 ( 或者算法 ), 将字符集的字符与二进制做一个映射,使得计算机能够识别和存储。

由此看出,字符集和字符编码是紧密相联的。计算机会在字符集的基础上建立相应的字符图形。对于某个文件,在计算机读取时,会按照实现约定好的字符编码来进行读取,然后根据对应的字符转为字符图形,最后呈现在用户面前的才是熟悉的字符。

下面先介绍与本文相关的几种字符编码方案:

ASCII(American Standard Code for Information Interchange)

在 20 世纪 60 年代由 ANSI 组织制定的标准的单字节编码方案。ASCII 编码使用 7 位二进制的组合(字节的最高位忽略)来表示 128 个英文字符 , 从而顺利的解决了美国英文的编码问题,由于 ASCII 码出现比较早,后来的很多编码方案都是受它的影响。

扩展 ASCII-ISO8859

由于英文字符总数不多,所以标准的 ASCII 就能很好的解决问题,但对于欧洲其他国家,比如希腊,就有其希腊语的特定需要。因此,为了解决这个问题,国际化标准组织借鉴了标准 ASCII 的设计思想,创造了利用 8 位二进制数来表示字符的扩展 ASCII,并制定了一系列标准 :ISO8859。其原理就是在 0-127 的编码和标准 ASCII 相兼容基础上,将 128 到 255 用作其他语言字符的编码,这样,各种语言就可以制定自己的扩展 ASCII 字符 . 这样就得到了大量不同的编码表,比如 ISO8859-1 字符集,也就是 Latin-1,是西欧常用字符,包括德法两国的字母。ISO8859-2 字符集,也称为 Latin-2,收集了东欧字符。AIX 上的编码就是基于 ASCII-ISO8859 标准集的。

GB2321

西方的语言是由字符总数不多的单词组成,所以扩展 ASCII 就能满足需求了,但对于 CJK (Chinese,Japanese,Korean)等亚洲国家来说,256 个字符是远远不够表示自己国家的全部字符。中国专家发挥了聪明才智,借鉴了 ISO8859 的成功经验,利用双字节来表示汉字,为了具有兼容性,每个字节的 0-127 均为 ASCII 保留,低字节使用从 0xA1-0xFE,高字节使用从 0xB0-0xF7 的区间,这样就能表示 94*72 = 6768 个中文汉字了。这个编码标准就是 GB2312-80 (国家标准)。

GBK

汉字的总数可以用浩如烟海来形容,在使用 GB2312 过程中发现有很多汉字还是没有包括在其中 . 因此 1995 年,推出了汉字内码扩展规范,即 GBK( 国标扩展 ),向下兼容 GB2312,向上支持 ISO10646. GBK 也是采用双字节,总体编码在 8140-FEFE 之间,高字节在 0x81-0xFE 之间,低字节在 0x40-0xFE 之间,不包括 7F。在 GBK 1.0 中共收录了 21886 个符号,汉字有 21003 个。GBK 虽然不是国家标准,只是一个规范,但是却得到了非常广泛的应用,Windows 简体中文版的缺省内码还是 GBK。图 1 为 GBK 的编码结构(Code Scheme)。


图 1.GBK 的编码结构(Code Scheme)
EBCDIC 与 GBK 的字符编码及其转换

其中 GBK1 收录除 GB2312 符号外的增补符号 ,GBK5 为非中文字符集,GBK2 收录 GB2312 汉字,GBK3 收录 CJK 汉字 ,GBK4 收录 CJK 汉字和增补汉字,UDC 区为用户自定义字符区 .

GB18030

GB18030 是最新的汉字编码字符集国家标准,向下兼容 GBK 和 GB2312 标准。GB18030 编码是一二四字节变长编码,收录了中日韩 27484 个汉字。

EBCDIC

EBCDIC--Extended Binary Coded Decimal Interchange Code(扩展二进制编码的十进制交换码),是字母或数字字符的二进制编码,是 IBM 专门为它的 z/OS 和 IBM i(原 AS/400)的操作系统使用的字符编码。

Unicode 不是我们讨论的重点,在这里就不介绍了。

CDRA 字符编码体系

IBM i 和 z/OS 是支持多国语言的平台,用户可以使用任何一种你想使用的语言,当然,前提是你的机器安装了这种语言。下面,简单介绍其基本原理。

CDRA--Character Data Representation Architecture(字符数据表示架构),这个 IBM 架构定义了一整套标识,资源,约定以及 API 来实现在数据处理环境中图形字符数据的一致性表示,处理,交换和在数据转换时维护数据完整性。可以发现,CDRA 涵盖范围主要是四方面:一个标识或标签系统,来保证图形字符数据的有效和唯一的呈现;一套可移植的 API;一套支持标签和服务的资源;一套使用标签和服务的约定;还有在图形字符转换的策略。我们从其中核心的几方面来认识 CDRA。

CDRA 对字符集的分类 ---Character Set Groups

为了减少正在使用的图形字符集(Graphic Character Set)和代码页(Code Page)的不断增加带来的问题,IBM 将不同国家使用的不同语言,根据语言特有的特性进行分组。如 Figure 2 所示:

图 2. 字符集的分类
EBCDIC 与 GBK 的字符编码及其转换

Group1 包括使用单字节编码(SBCS)的 Latin Alphabet Number 1 字符集的语言。

Group1a 同样是以单字节编码,包含非拉丁字母以及没在 Latin Alphabet Number 1 的拉丁字母。

Group2 包含了远东地区 ( 中国,日本,韩国,泰国等 ) 的语言。这些国家和地区的图形字符是使用多字节编码 (DBCS 或 MBCS) 的。

Group Universal 包括了所有支持 Unicode 和 ISO-10646 的所有大字符集。

CDRA 的命名系统 ---CDRA Identifiers

首先要明确的是 CDRA 要处理的对象是图形字符数据(Graphic Character Data)以及某些控制字符数据,其中介绍比较关键的几个 ID:

Graphic Character Global Identifier and Graphic Character UCS Identifier(GCGID,GCUID)

主要用于为 Character Set 和 Code Page 呈现图形字符所用,是与编码独立的,并不直接参与 Tag Data。GCGID 在呈现字符处理方面,比如格式化,表现和打印等,具有极其重要的作用。

Encoding Scheme Identifier(ESID),这就是我们非常熟悉的字符编码方案。CDRA 主要的 Encoding Scheme 如表 1:

表 1. CDRA 主要的 Encoding Scheme

ESID Interpretation
1100 EBCDIC, single-byte
1200 EBCDIC, double-byte
2100 IBM-PC Data, single-byte
2200 IBM-PC Data, double-byte
3100 IBM-PC Display, single-byte
3200 IBM-PC Display, double-byte
4100 ISO 8, single-byte

Code Page Global Identifier(CPGID)

即平常所说的 Code Page,也就是经过编码后,字符代码与二进制的映射表,是 Code Points 的集合。

Coded Character Set Identifier(CCSID)

Encoding Scheme ID,Coded Graphic Character Set Global ID 以及 Code Page ID 等组成了 Long-Form ID,以此能清楚地描述 CDRA 的 ID 体系 , 但很多实现和架构并不支持变长的 Tags, 为此,CDRA 提出了 CCSID 的解决方案。一个 16 位的 CCSID 代表着一种数据编码,给出一个 CCSID 和 Code Point,就能唯一的定位到一个字符。表 2 能看出一些常见的 CCSID 以及其他 ID 的映射关系。

表 2. 常见的 CCSID 与其他 ID 的关系

CCSID Code Page Character Set Encoding Description
00037 00037 00697 1100 US, Canada, Netherlands, Portugal, Brazil
00423 00423 00218 1100 Greece
00819 00819 00697 4100 ISO 8859-1; Latin Alphabet NO. 1
00850 00850 01106 2100 PC Data; MLP 222 Latin Alphabet 1
00935 00836 00837 01174 00937 1301 Simple Chinese(Extended Range)
01386 01114 01385 65535 65535 2300 Simplified Chinese PC Data GBK mixed

由上表可以发现,CCSID 和 Code Page ID 保持很好的同一性,这是因为现有的字符架构和实现也有了 Tag 的概念,有些是用 Code Page ID,而有些则是 Code Page ID 和 Character Set ID 一起,为了使 CDRA 具有更好的兼容性和可理解性,CDRA 会尽可能的将 CCSID 与其 Code Page 的值设为一样。

通过 CCSID,我们可以知道它是如何进行编码的,它都包含了哪些字符,以及这些字符的图形是如何呈现的,这样这些 ID 就构成了浑然一体的 CDRA 命名系统。

如何保证 Graphic Character Integrity--Tag CCSID

国际化必然带来数据完整性的挑战,如果本国用户不能准确与国外用户进行正常的交流,国际化是无从谈起的。通过 Tagging CCSID,我们就可以维护数据的完整性(Data Integrity)。所谓 Tagging,这是用来识别与呈现字符数据的主要手段,在给一个对象(FILE,Job,Database Table 或是 Database Stream)的 Field 添加这样的标识,就叫 Tagging。譬如,在 IBM i,当我们将一个 Physical File tag 为 CCSID 037,那么在 United Kingdom(job CCSID 285)和 Denmark(job CCSID 277)的用户则可以看到同样的文件内容,如表 3。这种转换和映射是由数据库来完成的。

表 3. 同一字符在不同 CCSID 下的区别

Country Keyboard Type Code Page CCSID Code Point Character
U.S USB 037 00037 X5B $
U.K UKB 285 00285 X4A $
Denmark DMB 277 00277 X67 $

CCSID 显得特别的重要,因为支持 CDRA 的平台需要在不同语言的主机之间交换数据。不同语言,键盘和终端显示可以安装在同一平台上,这些都是 CCSID 在提供强大的支持。

IBM i 的 DBCS 支持

在第一章提到,有些国家与地区的语言比较复杂,一个字节不能将其所有语言文件进行正确的表达,所以必须用两个或更多的字节来进行编码,比如 GB2312 和 GBK 等。IBM i 对 DBCS 提供了很好的支持。

Code Schemes

IBM i 支持以下 4 种 DBCS:

IBM Japanese Character Set;

IBM Korean Character Set;

IBM Simplified Chinese Character Set;

IBM Traditional Chinese Character Set。

如图 3 是 CCSID935 中 DBCS 的 Code Scheme。

图 3.CCSID 935 中 DBCS 的 Code Scheme
EBCDIC 与 GBK 的字符编码及其转换

其中 Area 1 包括 GBK/1 和部分 GBK/5 的字符;Area 2 为全部 GBK/2 的字符;Area 3 为全部 GBK/3 的字符;Area 4 为 GBK/4a 中全部 ISO 10646-1 的 CJK 字符;Area 4b 为其他 GBK/4 的字符;Area 5 为部分 GBK/5 字符;Area 6 为用户自定义字符。

DBCS 与 SBCS 的区分

如果 IBM-host 的 code scheme(比如 EBCDIC)正在使用,那系统会以 shift-control 字符作为 double-byte 字符的起始和终结的标识。其中 Shift-out(SO)字符,十六进制为 0E 是起始符,Shift-in(SI)字符,十六进制为 0F 是终结符。请看一下 CCSID 为 935 的例子,如图 4:

图 4.DBCS 与 SBCS 的区分
EBCDIC 与 GBK 的字符编码及其转换

如果要在 CL 命令中输入双字节字符 , 可以按照一下步骤 :

先输入单引号 (');

输入一个 shift-out 字符 ;

输入你所需的双字节字符 ;

再输入一个 shift-in 字符 ;

最后以一个单引号结束 (');

常见的简体中文字符集

如表 4 是 IBM i 支持的常见的简体中文字符集。值得注意的是,在 AIX 上 GBK 的字符集,在 IBM i 对应的是 01388。这个 CCSID 是在 IBM i 上最常用的简体中文编码之一。

表 4. 常见的简体中文字符集

CCSID Encoding Scheme Description
00836 1100 Simplified Chinese (extended range)
00837 1200 Simplified Chinese
00935 1301 Simplified Chinese (extended range)
01381 2300 Simplified Chinese GB personal computer mixed SBCS and DBCS
01386 2300 Simplified Chinese PC Data GBK mixed,all GBK character set and others
01388 1301 Simplified Chinese DBCS- GB 18030 Host with UDCs and Uygur extension.

AIX 上的字符转换

AIX 的字符转换是由系统内部自动完成的,就如同上述的一个例子。AIX 与 IBM i 进行通信时,那内部到底发生了些什么?

图 5. 字符转换的过程
EBCDIC 与 GBK 的字符编码及其转换

如图 5 所示即为字符转换的过程 , 转换表 (Conversion Table) 是已经设计好了,但单单有转换表还不能保证在不同的计算环境中数据传输和共享的准确 . 而转换方法就是要准确的使用转换表,以确保输出是期望的结果 . 转换方法会分析输入数据的 Encoding Scheme 和 String Type,进行必要处理后,然后根据要求输出数据的 Encoding Scheme 和 String Type,再选择合适的转换表进行转换,才能得到准确的转换结果。对输入数据进行的处理包括子字符串的切割,如果输入数据包含 code extension 的控制字符。每一类子字符串应该具有相同的 Code Page 和 Character Set。

在 AIX 上的目录:/usr/lib/nls/loc/iconvTable 下可以看到一部分转换表。

要注意的是,并不是所有图形字符都彼此支持相互转换的 . 显然,CCSID935 中的 DBCS 是无法转换为 CCSID037 的 SBCS. 这也就是为什么将 CCSID 为 935 的文件转换为 CCSID 为 037 后,里面的中文字符全部是不可阅读的 .

如何通过编程实现自定义的字符转换

上述均是字符数据处理的一些基本原理,在实际产品开发中会经常需要对字符进行转换,比如碰到一些文件打开后是乱码;再比如在网络通信应用程序中,为了减轻服务器端对编码转换的负担,客户端可以先将码流转换为服务器端的编码,再进行网络传输(比如 AIX 平台和 IBM i 的通信),下面介绍两种字符转换方法,以供参考。

利用 iconv comman

iconv 命令应该对很多人来说都很熟悉,它可以将字符从一种字符编码转换为另外一种字符编码,而且非常简单易用,比如将文件从 GBK 转换为 CCSID935:

 iconv -f GBK -t IBM_935 file.txt 

而 iconv --list 可以查看 iconv 支持的字符编码方案。

d

利用 API

iconv API 使用也是非常方便的,如下代码示例,将输入字符串从 CCSID 为 850 转换为 037:


清单 1. 将字符串从 CCSID 为 850 转换为 037

 int EbcdicToAscii(char *sIn, char *sOut) 
 { 
  iconv_t cd; 
  size_t inBytesLeft = 0; 
  size_t outBytesLeft = 0; 
  char *inTemp = sIn; 
  char *outTemp = sOut; 
  char localCode[20], targetCode[20]; 
 
  inBytesLeft = strlen(sIn); 
  outBytesLeft = strlen(sIn) * 2; 
  memset(&localCode, 0x00, sizeof(localCode)); 
  sprintf(localCode, "%s", "IBM-850");/*850 ASCII */ 
 
  memset(&targetCode, 0x00, sizeof(targetCode)); 
  sprintf(targetCode, "%s", "IBM-037"); /* 037 for EBCDIC */ 
 
  cd = iconv_open(localCode, targetCode); 
   
  if (iconv(cd, &inTemp, &inBytesLeft, &outTemp, &outBytesLeft) != 0) 
  { 
   printf("Error calling iconv\n"); 
   if (iconv_close(cd) == -1) 
   { 
     printf("Error calling iconv_Close\n"); 
     return 1; 
   } 
  } 
 
  if (iconv_close(cd) == -1) 
  { 
    printf("Error calling iconv_Close\n"); 
    return (1); 
  } 
 
  return 0; 
 } 

AIX,IBM i,QSHELL 和 PASE(Portable Application Solution Environment)均提供了 iconv 的支持。下面以 AIX 为例,对 iconv 的基本原理做简单的介绍:当执行 iconv,系统会调用 /usr/lib/nls/loc/iconv 中相应的可执行程序(Converter Programs),根据需要转换的字符编码,在 /usr/lib/nls/loc/iconvTable 中选中相应的转换表(Converter Tables),并完成转换。用户也可以写自己的转换程序,可在编译时与 libiconv.a 链接,那程序就会在 /usr/lib/nls/loc/iconv 目录下生成一个转换程序,而转换表需要利用 genxlt 工具来帮助生成。

关于字符转换的一些小 Tips

在 AIX 上将 CCSID 为 037 的文件转换为 UTF-8,在命令行敲入:iconv -f IBM-037 -t UTF-8 file.txt

AIX 向 IBM i 传送带中文字符的文件:

在 IBM i 创建一个 CCSID 为 935 的 Source Physical File,在 CL 命令行中敲入 : CRTSRCPF FILE(QTEMP/TEMP) CCSID(935)

在 AIX 上 FTP 到 IBM i,然后在命令行敲入:quote type c 1386(GBK) 或者 1381(GB2312),表明现在要传送的文件的字符编码是 GBK 或者 GB2312 类型的。在 IBM i 端如何转换,则由 IBM i 端的 CCSID 决定,这就是为什么第一步需要创建 CCSID 为 935 的文件。IBM i 端会内部将 1386(1381)的编码转换为 935 的编码。然后在命令行敲入 put localfile temp.temp 完成传送。

总结

对字符编码概念,体系以及字符转换原理进行一定的学习和理解,对在涉及不同平台交换数据以及对字符进行处理时比较有帮助,也比较有必要。

Tags:EBCDIC GBK 字符

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接