纯C++怎么读取UTF-8格式的中文文本文件

时间:2023-01-05 21:45:12
c++ linux 百度 语言 平台

19 个解决方案

#1


按照格式度就没问题啊。。。四个字节的。

#2


怎么读取?
怎么显示?

#3


可是读取出来是乱码,具体代码怎么写啊,我是新手

#4


UTF每个字符占两个字节,读取的时候要注意了。

#5


先用fread取得字符到缓冲区,然后用iconv进行编码转换,具体操作可以参考(http://qq164587043.blog.51cto.com/261469/63349)。

引用 楼主 yidierlw 的回复:
项目中有一文本文件,里面是UTF-8编码,读取后显示中文乱码,请问有什么办法能解决,百度搜了半天都没得到满意答案,平台为LINUX,语言为纯C++
              
                  c++
                  linux
                  百度
                  语言
          ……

#6


查一下linux api的手册

#7


设置系统的locale为utf-8
源码最好也是utf-8的
如果环境不能设置成utf-8那就得用iconv来转码了

#8


你终端不是utf-8编码,文件再怎么折腾也没用。

#9


要么把文件改成 gbk 编码,要么在程序中读出来后做一个转码再显示。
不推荐在程序中使用中文,英文不会有这些多余的麻烦。

#10


读取出来进行编码转换之后再显示

#11


把终端设置成utf8格式吧.其它的都不用动.

#12


引用 11 楼 redleaves 的回复:
把终端设置成utf8格式吧.其它的都不用动.

~~~~正解,楼主可以结贴啦

#13


虽然不懂C/C++,我在这边只是潜水,但纠正一下上面的一些说法

utf-8是变长的,不能单纯按字节计算,除非你熟练掌握utf-8的算法——官方有公开资料,很简单的计算而已
utf-8内的汉字如果不涉及extend B/C/D(version 6),是三字节,涉及就要考虑变长
而且你不能保证整个文本只有汉字,如果有韩文等等,也不是三字节的……

所谓乱码,是三方的编码不统一的结果:源、程序码文件、终端
程序码文件如果全部是ASCII就可忽略,因为0-127在ANSI和unicode是一致的

如果有类库可以处理unicode,直接作用类库好了,懒得自己读字节搞计算,保持三方一致就行

unicode文本文件还要做除BOM操作,如果用类库,一般都已经帮你完成,自己读字节的话就要考虑

UCS2是定长2字节,utf-32是定长4字节,utf-8和utf-16都是变长的,utf-16要考虑高低位,utf-8则没有高低位问题

#14


你需要将UTF8转换成本地语言, 或转换成UnionCode再显示
直接将UTF8传给渲染API可能会当作ANSI,从而转换失败,渲染错误

#15


这个看你是否要显示,如果要显示的话,必须转换编码,windows 默认的中文编码是 gb2312 而不是 utf8,如果你不需要显示,比如只需要转存到另一个文件中,那么无需转码,直接复制过去就行。这久好比传送密码,中途站如果只是传送不想看内容就不必解码,如果中途站也想看到内容就必须解码。

#16


用转码的库。
UTF-8不是等长的,比如a就1B,而大多数汉字是2B,它只是Unicode的一种实现形式。
具体看这个
http://www.kuqin.com/language/20080507/8130.html
至于怎么转换,那就该用第三方的库了。

#17


UTF-8几乎所有汉字都是三字节。

#18


谢谢大家,我知道了

#19


是怎么解决的?我要读取文件(中文+一点点英文),并提取文件中的部分内容,需要进行字符串的比较,调试的时候发现读的都是乱码~明明相等的,比较结果是不相等~~

#1


按照格式度就没问题啊。。。四个字节的。

#2


怎么读取?
怎么显示?

#3


可是读取出来是乱码,具体代码怎么写啊,我是新手

#4


UTF每个字符占两个字节,读取的时候要注意了。

#5


先用fread取得字符到缓冲区,然后用iconv进行编码转换,具体操作可以参考(http://qq164587043.blog.51cto.com/261469/63349)。

引用 楼主 yidierlw 的回复:
项目中有一文本文件,里面是UTF-8编码,读取后显示中文乱码,请问有什么办法能解决,百度搜了半天都没得到满意答案,平台为LINUX,语言为纯C++
              
                  c++
                  linux
                  百度
                  语言
          ……

#6


查一下linux api的手册

#7


设置系统的locale为utf-8
源码最好也是utf-8的
如果环境不能设置成utf-8那就得用iconv来转码了

#8


你终端不是utf-8编码,文件再怎么折腾也没用。

#9


要么把文件改成 gbk 编码,要么在程序中读出来后做一个转码再显示。
不推荐在程序中使用中文,英文不会有这些多余的麻烦。

#10


读取出来进行编码转换之后再显示

#11


把终端设置成utf8格式吧.其它的都不用动.

#12


引用 11 楼 redleaves 的回复:
把终端设置成utf8格式吧.其它的都不用动.

~~~~正解,楼主可以结贴啦

#13


虽然不懂C/C++,我在这边只是潜水,但纠正一下上面的一些说法

utf-8是变长的,不能单纯按字节计算,除非你熟练掌握utf-8的算法——官方有公开资料,很简单的计算而已
utf-8内的汉字如果不涉及extend B/C/D(version 6),是三字节,涉及就要考虑变长
而且你不能保证整个文本只有汉字,如果有韩文等等,也不是三字节的……

所谓乱码,是三方的编码不统一的结果:源、程序码文件、终端
程序码文件如果全部是ASCII就可忽略,因为0-127在ANSI和unicode是一致的

如果有类库可以处理unicode,直接作用类库好了,懒得自己读字节搞计算,保持三方一致就行

unicode文本文件还要做除BOM操作,如果用类库,一般都已经帮你完成,自己读字节的话就要考虑

UCS2是定长2字节,utf-32是定长4字节,utf-8和utf-16都是变长的,utf-16要考虑高低位,utf-8则没有高低位问题

#14


你需要将UTF8转换成本地语言, 或转换成UnionCode再显示
直接将UTF8传给渲染API可能会当作ANSI,从而转换失败,渲染错误

#15


这个看你是否要显示,如果要显示的话,必须转换编码,windows 默认的中文编码是 gb2312 而不是 utf8,如果你不需要显示,比如只需要转存到另一个文件中,那么无需转码,直接复制过去就行。这久好比传送密码,中途站如果只是传送不想看内容就不必解码,如果中途站也想看到内容就必须解码。

#16


用转码的库。
UTF-8不是等长的,比如a就1B,而大多数汉字是2B,它只是Unicode的一种实现形式。
具体看这个
http://www.kuqin.com/language/20080507/8130.html
至于怎么转换,那就该用第三方的库了。

#17


UTF-8几乎所有汉字都是三字节。

#18


谢谢大家,我知道了

#19


是怎么解决的?我要读取文件(中文+一点点英文),并提取文件中的部分内容,需要进行字符串的比较,调试的时候发现读的都是乱码~明明相等的,比较结果是不相等~~

#20