linux下面 c++ string的编码

来源:互联网 发布:不明觉厉等网络流行语 编辑:程序博客网 时间:2024/06/04 17:42

     最近遇到了一个问题,已经纠结了两天了,现在终于解决了,记录一下,以后再遇到此类问题也有一个参考。

       前段时间开发了一个linux下面的数据导入工具,简单的描述一下该工具的功能:该工具会定期的将服务器上的log文件分析之后写入到mysql数据库中,最初是用程序insert,后来发现效率实在太低下了,1W条数据大概需要3分钟的时间,简直不能忍受,要知道,需要处理的数据文件单个可以达到上百M,就是每个文件里面都会有大概200W条记录左右,使用程序insert的方法导一个文件岂不是要等到猴年马月才能导完?!最后,终于找到一个高效的方法,使用load data infile,就是先把log文件里面的内容分析之后格式化的写入到文本文件中,然后再用load data infile工具导入到mysql数据库中,200W条数据大概只花了不到1分钟的时间吧,bingo!这种方法才是我们想要的!!在windows中运行没问题,写入的中文字段什么也显示正常。但是移植到linux下面之后,中文导入到mysql中始终是乱码。

    这个时候,我做了几个测试,首先,使用在windows中load成功的文本文件,在linux的mysql命令行中使用load data infile,最后导入之后mysql中文显示正常,将linux中待load的文本文件放在windows下面导入,中文也会乱码。这个时候就很明了了,windows环境下c++写入的文件格式是正确的,linux下面c++写入的文件格式和mysql的格式不符合。这里顺便说一下,我的mysql格式为utf-8,windows下面使用c++ string写入的文本文件也为utf-8格式,linux下面使用c++ string写入的文件却为ansi格式。到底什么会导致两个系统,同样的代码,c++的string格式尽然会不同?

   首先我想到的肯定是两个系统的字符集的差异,首先我将linux的locale全部修改成utf-8格式的,但是还是不行,将vim的fileencoding强制设置为utf-8,也不行。最后看了一下代码,发现头文件和源文件均为ansi的格式,我想不会是因为代码的格式所造成的吧,修改了一下代码的格式,将他们改成了utf-8格式的,果然就可以了,c++ string全都变成了utf-8个格式。

    总结:在linux下面,c++的字符串的格式与源文件的格式有关,与linux的locale是无关的,locale只负责系统字符的显示,对c++的string格式无影响,vim的encoding也是同样的道理,它只与使用vim打开的文本文件的显示有关,并不负责转码。至于有人问为什么同样在windows下面源码文件的编码也为ansi,为什么写入的string却为utf-8,我想这是跟编译器的默认字符集有关,我用的visual studio,默认的字符集为unicode,所以c++ string的格式也为unicode格式的。

原创粉丝点击