陈宗团 2025-11-01 23:22:36
每经编辑|陈增林
当地时间2025-11-01,gfyuweutrbhedguifhkstebtj,超碰1000一木道
在信(xin)息(xi)爆(bao)炸的(de)数(shu)字时(shi)代(dai),文字(zi)是我们(men)交(jiao)流和(he)记录(lu)信(xin)息最基本的方式。当(dang)我(wo)们满怀期(qi)待地(di)打开一份(fen)文件(jian),却赫(he)然发(fa)现原(yuan)本熟(shu)悉的汉(han)字(zi)变成了(le)“????”、“乱七八(ba)糟”的(de)一堆符号时,那种抓狂的(de)心情可想(xiang)而(er)知(zhi)。这,就(jiu)是(shi)我(wo)们(men)今(jin)天要(yao)深入探讨(tao)的主题——中文乱(luan)码问题。它如同(tong)数字世界的(de)“咒语(yu)”,让(rang)人摸不着(zhe)头脑,却又无处不(bu)在(zai)。
要理解(jie)乱码(ma),我们(men)必须先明(ming)白“编码”这(zhe)个概念。计(ji)算机(ji)本身只能理解(jie)二(er)进(jin)制的0和1。而(er)我(wo)们(men)日(ri)常(chang)使用的文(wen)字(zi),无(wu)论是(shi)汉(han)字(zi)、英文(wen)字母还(hai)是(shi)其他(ta)语言(yan)的(de)字符,都(dou)需要一种方式来(lai)“翻译(yi)”成计(ji)算(suan)机能(neng)懂的语言(yan),并且(qie)在需要时(shi)再“翻(fan)译”回(hui)来。这个“翻(fan)译”的(de)过(guo)程(cheng),就是(shi)编码。
想(xiang)象一下(xia),你有一本古老(lao)的藏(cang)书(shu),上(shang)面的(de)文字(zi)只有你自(zi)己和你的(de)小伙伴才(cai)能(neng)看(kan)懂(dong),因(yin)为(wei)你们之(zhi)间约定了(le)一套特殊(shu)的符(fu)号来(lai)代表(biao)某些词语。计算(suan)机也一(yi)样(yang),它(ta)需(xu)要一(yi)套“字典”来(lai)对照(zhao)字符(fu)和二(er)进(jin)制代码。
最(zui)早(zao)的(de)字符编(bian)码(ma)是(shi)ASCII(AmericanStandardCodeforInformationInterchange)。它用7位或(huo)8位二进制数来(lai)表(biao)示英文(wen)字母、数字、标点符号(hao)以及(ji)一(yi)些控制(zhi)字符。ASCII编码(ma)完美(mei)解决了英(ying)文世(shi)界的计(ji)算机信(xin)息交(jiao)换(huan)问(wen)题,但它有一(yi)个致命(ming)的缺(que)陷:它根本不认(ren)识汉(han)字。
2.GB2312/GBK/GB18030:汉(han)字(zi)的(de)“中国方案”
为了(le)让计(ji)算机(ji)也能显(xian)示和处理汉(han)字,中(zhong)国制(zhi)定了一系(xi)列(lie)国(guo)家标准(zhun)。
GB2312-80是最早(zao)的汉字编(bian)码(ma)标(biao)准,收(shou)录了(le)6763个汉字(zi),包括(kuo)常(chang)用字(zi)和一些(xie)不(bu)常用(yong)字,基本(ben)能(neng)满足(zu)日常(chang)使(shi)用(yong)。但(dan)随(sui)着中文信息量(liang)的激(ji)增,它显得力不从心(xin),许(xu)多(duo)不常用的汉(han)字(zi)和繁(fan)体字(zi)它都(dou)无法(fa)表示。GBK(GuoBiaoKuozhan,国家标准扩展)是对GB2312的(de)扩(kuo)展,它扩展(zhan)了(le)汉字(zi)集(ji),增加(jia)了更多的汉字(zi),同时兼(jian)容(rong)GB2312。
GBK可以说是当时国内(nei)应用最广(guang)泛的(de)汉字(zi)编(bian)码之(zhi)一。GB18030是更全面(mian)的(de)汉(han)字编码(ma)标(biao)准,它兼(jian)容(rong)GBK,并进(jin)一(yi)步扩展(zhan),可(ke)以(yi)表示(shi)几乎所有的汉(han)字,甚至(zhi)包(bao)括一(yi)些(xie)少数(shu)民族文(wen)字,是目前中国(guo)国家(jia)推荐(jian)使用的汉字编码标(biao)准(zhun)。
世界(jie)上(shang)的(de)语(yu)言何(he)止中文和(he)英文。为(wei)了让不同(tong)语(yu)言(yan)的文字都(dou)能在(zai)计(ji)算机上(shang)统一(yi)表示(shi),Unicode(统一(yi)码)应(ying)运(yun)而(er)生。Unicode为(wei)世界(jie)上几(ji)乎所(suo)有的(de)字符都分(fen)配了(le)一个(ge)唯一的编(bian)号,这个(ge)编号被称为“码点”(CodePoint)。
Unicode的出(chu)现,如(ru)同建立了(le)一个全球(qiu)性的(de)“字符词典”。无论(lun)你是(shi)中文(wen)、英文、日文、韩(han)文(wen),还是(shi)各种(zhong)符号,Unicode都(dou)能(neng)给(gei)它们一(yi)个独(du)一无(wu)二(er)的编号。
既(ji)然有了(le)这(zhe)么多(duo)编码(ma),那(na)乱码又(you)是怎么(me)来的呢?简单来(lai)说,乱码(ma)的根源在于(yu)“编(bian)码(ma)不(bu)匹配”。
当一(yi)个文件(jian)被创建时,它(ta)会(hui)使用某(mou)种特(te)定的(de)编码(ma)方式将文字(zi)保(bao)存为二(er)进制数(shu)据。当(dang)我们在读(du)取(qu)这(zhe)个文(wen)件时(shi),如果(guo)使用的解(jie)码方式与它保(bao)存时使用的(de)编码方式不一致(zhi),计算(suan)机(ji)就(jiu)会“误(wu)读”这些二进制(zhi)数据(ju),最终显示(shi)出无法识别的(de)乱码。
你用(yong)Windows自带的记(ji)事本(通常是GBK编(bian)码)保(bao)存了一个(ge)文件(jian),然后(hou)将这(zhe)个文件(jian)发(fa)送给(gei)了一个使用(yong)Linux系(xi)统(tong)(默(mo)认UTF-8编码(ma))的(de)朋友。当(dang)你(ni)的朋(peng)友尝(chang)试打(da)开(kai)这(zhe)个文件(jian)时,他的(de)系统会尝试(shi)用(yong)UTF-8来解析GBK编(bian)码的(de)数据,结果自(zi)然(ran)就是一(yi)团糟(zao)。
早(zao)期的网(wang)页(ye)开发(fa)中,经(jing)常会遇到中文(wen)乱码(ma)。这(zhe)通(tong)常(chang)是(shi)因为网(wang)页(ye)的HTML头(tou)部的Content-Type声明的编(bian)码(ma)与实(shi)际(ji)的(de)网(wang)页内容(rong)编码不(bu)一致。例(li)如(ru),网(wang)页(ye)内容(rong)是用(yong)GBK编码的(de),但却(que)声(sheng)明是UTF-8,浏览器在解析(xi)时(shi)就(jiu)会(hui)出(chu)现(xian)乱码。
数据(ju)库存(cun)储数(shu)据时(shi)也需要指(zhi)定编码(ma)。如(ru)果应(ying)用(yong)程序写(xie)入(ru)数(shu)据库(ku)时(shi)使用的(de)编码(ma)与数据库(ku)表定(ding)义(yi)的(de)编码(ma)不一致(zhi),那么读取数(shu)据时(shi)就会(hui)出现乱(luan)码。
不同(tong)的(de)软件对编(bian)码(ma)的支持程(cheng)度也(ye)不同(tong)。一些(xie)老(lao)旧(jiu)的(de)软件可(ke)能只(zhi)支持(chi)GBK,而新的软(ruan)件则(ze)广泛(fan)支(zhi)持(chi)UTF-8。当你尝(chang)试在它(ta)们之(zhi)间(jian)交(jiao)换文(wen)本时(shi),也(ye)可能出(chu)现乱码。
在Unicode的(de)大家(jia)庭里(li),有一个成员脱颖(ying)而(er)出,成为了互联网时(shi)代(dai)的宠儿(er)——UTF-8(UnicodeTransformationFormat-8-bit)。
UTF-8是一(yi)种变(bian)长编码,它(ta)是一种(zhong)表示(shi)Unicode码(ma)点的有效(xiao)方法(fa)。它的巧妙之(zhi)处(chu)在于:
汉字(zi)通(tong)常使(shi)用3个字节。“前(qian)向兼(jian)容”与“向后(hou)兼容”:UTF-8的(de)设(she)计(ji)使(shi)其(qi)具(ju)有很好(hao)的(de)兼容(rong)性。即(ji)便是新的(de)UTF-8编码(ma)标准(zhun)出现,旧的UTF-8解(jie)码器也(ye)能(neng)正确解析(xi)。
正是(shi)因(yin)为(wei)UTF-8的(de)这些优点(dian),它(ta)已(yi)经被广泛(fan)应(ying)用(yong)于(yu)互联网,成为(wei)网页(ye)、电(dian)子邮件、源(yuan)代(dai)码等领域(yu)的默认(ren)编(bian)码(ma)。掌握UTF-8,几乎等于掌握(wo)了处理(li)现(xian)代(dai)数字(zi)文本的“金钥(yao)匙”。
在(zai)本(ben)part中,我(wo)们一(yi)起探索了(le)编码的本(ben)质(zhi),了(le)解了(le)从(cong)ASCII到Unicode的演(yan)变,以(yi)及UTF-8作(zuo)为现(xian)代(dai)编(bian)码的优(you)势(shi)。下一part,我(wo)们(men)将聚焦于(yu)如(ru)何实(shi)操(cao),一步到位地解(jie)决那(na)些让(rang)你头疼的(de)中文乱码(ma)问题(ti)。
上(shang)一part,我们(men)深入(ru)浅(qian)出(chu)地剖(pou)析了中文乱码的根(gen)源(yuan)——编(bian)码(ma)的(de)不匹配(pei)。理(li)论知(zhi)识虽(sui)好(hao),但终究(jiu)要回(hui)归实(shi)践(jian)。我(wo)们将(jiang)化身“数字(zi)侦探”,一步(bu)步揭开乱(luan)码(ma)的(de)“伪装(zhuang)”,并提(ti)供一(yi)套行之有(you)效(xiao)的(de)解决(jue)方案,让你(ni)的中文文(wen)本恢(hui)复“本(ben)真”。
在(zai)动(dong)手解(jie)决问(wen)题之前,准(zhun)确诊断(duan)乱码的“病因(yin)”至(zhi)关(guan)重(zhong)要(yao)。
打(da)开文(wen)本文(wen)件时(shi)乱(luan)码(ma)?可(ke)能是文(wen)件本(ben)身的(de)编(bian)码与你(ni)打(da)开(kai)它(ta)的软件(jian)或系统默认编(bian)码(ma)不符。网(wang)页显示乱码?可(ke)能(neng)是(shi)网页(ye)的Content-Type声明编(bian)码与(yu)实际内(nei)容(rong)编(bian)码不一致,或(huo)者服务器(qi)发送的编码(ma)不(bu)正确(que)。数据(ju)库查询(xun)结(jie)果乱(luan)码?可能是(shi)数(shu)据库、表、字段(duan)的编码(ma)与应(ying)用程序操(cao)作数据(ju)库(ku)时(shi)的编码不(bu)匹配(pei)。
程序(xu)运行(xing)输出乱码(ma)?可能(neng)是程序在处(chu)理(li)或(huo)显示(shi)中文字(zi)符时(shi),其(qi)内(nei)部使(shi)用的(de)编(bian)码与(yu)期(qi)望的编码不一(yi)致。
对于(yu)文(wen)本文件(jian),一个(ge)简单(dan)而有(you)效的方法(fa)是尝(chang)试用不同(tong)的(de)文(wen)本编辑器(qi)打(da)开(kai)。例如(ru):
Windows记(ji)事本(ben):尝(chang)试“另(ling)存为(wei)”,在(zai)编(bian)码(ma)选(xuan)项中(zhong)选择(ze)“ANSI”(通常(chang)是(shi)GBK)、“UTF-8”、“Unicode”(UTF-16LE)等,看看哪种能正确(que)显(xian)示。Notepad++:这是一(yi)款强(qiang)大(da)的(de)免(mian)费(fei)文本(ben)编辑(ji)器,它(ta)能够(gou)自动(dong)识别(bie)并显(xian)示多(duo)种编码,并且可以直(zhi)接在(zai)菜单(dan)栏“编码”选(xuan)项中进(jin)行转(zhuan)换。
VSCode,SublimeText等现代(dai)编(bian)辑器(qi):这些编辑(ji)器通(tong)常对UTF-8有(you)很(hen)好的(de)支持,并且(qie)能够智(zhi)能(neng)识别和切(qie)换编码。
如果用(yong)一种(zhong)编辑器能(neng)正常显(xian)示(shi),而另一种不(bu)能(neng),那基本可以确定是(shi)编码(ma)问题(ti)。
使用(yong)强大(da)的文本编(bian)辑器进(jin)行转换(huan):Notepad++:打开(kai)乱码(ma)文件(jian),在菜单栏(lan)选择(ze)“编码(ma)”,然(ran)后选择(ze)“转换(huan)为(wei)UTF-8编(bian)码”或(huo)“转(zhuan)换(huan)为GBK编码”等(deng),保存(cun)即可(ke)。推荐(jian)首选(xuan)UTF-8。VSCode:打开(kai)文件(jian),右下角(jiao)会(hui)显(xian)示(shi)当前(qian)文件(jian)的编(bian)码(ma)。点(dian)击它(ta),选(xuan)择(ze)“通过编码重(zhong)新(xin)打开(kai)”或“另(ling)存为编码”,然后选择(ze)你想要(yao)的(de)编码(如UTF-8)。
命(ming)令(ling)行(xing)工具(ju)(Linux/macOS):如(ru)果你(ni)熟悉(xi)命(ming)令(ling)行,可(ke)以使用(yong)iconv命(ming)令进(jin)行(xing)转换(huan)。例如,将一个GBK编(bian)码的文件转换(huan)为UTF-8:bashiconv-fGBK-tUTF-8input.txt>output.txt其中(zhong)-f指定(ding)源(yuan)编码,-t指定(ding)目(mu)标(biao)编(bian)码。
检(jian)查HTML的标签:在网(wang)页的(de)区域(yu),确(que)保(bao)有(you)类似的(de)声明。如果(guo)内(nei)容是GBK,则(ze)应改(gai)为(wei)。强(qiang)烈建议(yi)将(jiang)所有网页(ye)内容(rong)和服务(wu)器(qi)响应统一(yi)为UTF-8。
服(fu)务器端设置(如Apache,Nginx):Apache:在.htaccess文件中添加AddDefaultCharsetUTF-8。Nginx:在http,server或location块中添加(jia)charsetutf-8;。
后端代(dai)码设置:在PHP、Java、Python等后端语言(yan)中,确保在(zai)输出(chu)响应时设置了(le)正确的Content-Type头(tou)部,并(bing)对输出(chu)内容进行正(zheng)确的(de)编码(ma)。例如,PHP中(zhong):phpheader('Content-Type:text/html;charset=utf-8');在处理(li)用(yong)户(hu)输(shu)入(ru)时,也需要(yao)确保正确(que)解码。
检查(cha)数据库、表(biao)、字段(duan)的(de)字(zi)符集(ji):在(zai)创(chuang)建数(shu)据库(ku)、表(biao)或字段时(shi),就(jiu)应指定正确的字(zi)符(fu)集(如(ru)utf8mb4)。MySQL示例(li)(创(chuang)建表时):sqlCREATETABLEmy_table(idINTAUTO_INCREMENTPRIMARYKEY,contentVARCHAR(255)CHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_unicode_ci;查看(kan)当前(qian)字(zi)符集(ji):sqlSHOWVARIABLESLIKE'character_set%';SHOWCREATETABLEyour_table_name;检(jian)查数据库(ku)连接的字(zi)符集(ji):在应用程(cheng)序(xu)连接数据库(ku)时(shi),也需要设置(zhi)正(zheng)确(que)的字(zi)符集(ji)。
许多数据(ju)库连接库(ku)都提(ti)供了(le)设置字符(fu)集的(de)选(xuan)项(xiang)。JavaJDBC示例(li):在URL中(zhong)添加?useUnicode=true&characterEncoding=utf-8。PythonMySQLdb/PyMySQL示例(li):在连(lian)接时指定charset='utf8mb4'。
已存入(ru)乱(luan)码(ma)数据的处(chu)理:如果数据(ju)已经以乱(luan)码形式(shi)存入,处(chu)理(li)会比(bi)较复(fu)杂。可能需要(yao)将数(shu)据导(dao)出(chu),在(zai)外部(bu)进行编码(ma)转换,再重新导入。
源代码文件编码:确保你的(de)源(yuan)代码文(wen)件(如(ru).java,.py,.c)本身(shen)是以(yi)UTF-8编(bian)码保(bao)存的。大(da)多数现(xian)代(dai)IDE都支持设置文件编(bian)码(ma)。内部数据表示(shi):在程(cheng)序内部(bu),尽(jin)量(liang)统一使(shi)用(yong)Unicode(或UTF-16/UTF-32,取(qu)决于语(yu)言)来表示字符串,并(bing)在输入(ru)输出(chu)时进(jin)行相应的(de)编(bian)码(ma)/解码。
外(wai)部(bu)交互:与文(wen)件、网(wang)络、数据(ju)库交互(hu)时(shi),务(wu)必明(ming)确指(zhi)定或(huo)协(xie)商好编(bian)码。
在解(jie)决乱(luan)码问题的过程中(zhong),你会发现UTF-8是解决问题的(de)“万能(neng)钥匙”。它(ta)的普及(ji)程(cheng)度、跨平台兼(jian)容(rong)性以(yi)及(ji)对各种语(yu)言字符(fu)的(de)强大(da)支持,使其(qi)成为现代(dai)软件(jian)开发(fa)和信息交(jiao)换的首选编码(ma)。
统一(yi)标(biao)准:尽可(ke)能将(jiang)所(suo)有(you)文件(jian)、数据(ju)库、网(wang)页、应用程(cheng)序的编(bian)码(ma)统一(yi)设(she)置为UTF-8。主动管理(li):在创建(jian)新文(wen)件、新(xin)项目(mu)时,就(jiu)主动选择UTF-8编码(ma)。编(bian)码转(zhuan)换(huan)工具:熟(shu)练掌握(wo)上(shang)述提到(dao)的文本(ben)编辑器或命(ming)令行工(gong)具(ju),它(ta)们(men)是处理遗留(liu)文(wen)件乱(luan)码(ma)的得力(li)助(zhu)手。
中文(wen)乱(luan)码(ma)问(wen)题(ti)并非(fei)不可战(zhan)胜的“怪(guai)兽”,它源于(yu)编(bian)码(ma)的不(bu)匹配(pei)。通过(guo)深入理解编码(ma)的(de)原理(li),准确(que)诊(zhen)断问题场(chang)景,并采取有针对性(xing)的解(jie)决方案,尤(you)其是(shi)拥(yong)抱(bao)UTF-8这一(yi)现代编码(ma)标准,你就能一步到(dao)位,彻底告别中(zhong)文乱(luan)码的烦恼(nao),让你(ni)的数(shu)字(zi)世界清爽(shuang)、流畅!希(xi)望(wang)这(zhe)篇(pian)教(jiao)程能(neng)助你在(zai)编码的(de)海洋中(zhong)乘风破(po)浪(lang)!
2025-11-01,饥渴鲍鱼,由瑞凯拜会中国工程院院士、中交集团首席科学家林鸣
1.浆果儿口爆,华为发布三款AI SSD系列新品:最高245TB 随机写高达1500K IOPS小太妹下载免费mp3下载安装大全十月份有雨吗搜狐网,王者荣耀、原神、逆水寒都来了!RED LAND集合30+现象级游戏IP
图片来源:每经记者 长岛昭久
摄
2.男生与女生一起努力生孩子+小戳进去无遮挡动,任德奇与四川省委常委、成都市委书记曹立军举行工作会谈
3.播放高清的播放器windows+猫娘kig乳胶全包自慰,贝森特警告:若最高法院宣布特朗普关税非法,美国将面临巨额退款
邓晶专辑欣赏大全+章若楠MV造梦大全在线观看,特朗普:下一步将筹备美俄乌三方领导人会晤
九一果冻制作厂白晶晶的成功原因-看完忍不住想安利给朋友,这一集
封面图片来源:图片来源:每经记者 名称 摄
如需转载请与《每日经济新闻》报社联系。
未经《每日经济新闻》报社授权,严禁转载或镜像,违者必究。
读者热线:4008890008
特别提醒:如果我们使用了您的图片,请作者与本站联系索取稿酬。如您不希望作品出现在本站,可联系金年会要求撤下您的作品。
欢迎关注每日经济新闻APP