• R语言
  • 关于RPostgreSQL 的中文乱码问题

本人在使用RPostgreSQL的过程中,一直没有解决一个关于中文乱码的问题

问题描述:

从PostgreSQL的表中查询出的中文字段都是乱码, 另外 用中文字符 当参数 生成where条件 去查PostgreSQL的数据也是失败 .

PostgreSQL中 的数据库是 UTF-8 编码

win7 R 3.0.1 sessionInfo() 信息:

sion 3.0.0 (2013-04-03)

Platform: i386-w64-mingw32/i386 (32-bit)

locale:

[1] LC_COLLATE=Chinese (Simplified)_People's Republic of China.936

[2] LC_CTYPE=Chinese (Simplified)_People's Republic of China.936

[3] LC_MONETARY=Chinese (Simplified)_People's Republic of China.936

[4] LC_NUMERIC=C

[5] LC_TIME=Chinese (Simplified)_People's Republic of China.936

求助如何解决.

ps. 我在ubuntu中也试过 , 并不存在乱码的问题.

回复 第1楼 的 simbabest:

Windows下的编码简直就是心病,试试options(encoding = "UTF-8")行不行。

感谢回复,按options的方法 ,再试一次:

<br />
> options(encoding = "UTF-8")<br />
> source("calc_index.R")<br />
</p>

1.执行查询函数 中文参数:

<br />
> getIndexComp('3D概念')<br />
[1] "select blkname,secode from indst_classify where blkname like '3D概念%' ORDER BY secode limit 10"<br />
错误于postgresqlExecStatement(conn, statement, ...) :<br />
  RS-DBI driver: (could not Retrieve the result : ERROR:  invalid byte sequence for encoding "UTF8": 0xb8<br />
)<br />
</p>

2 执行查询函数 非中文参数.

<br />
> getIndexComp('3D')<br />
[1] "select blkname,secode from indst_classify where blkname like '3D%' ORDER BY secode limit 10"<br />
    blkname   secode<br />
1  3D鎵撳嵃 SH600071<br />
2  3D鎵撳嵃 SH600288<br />
3  3D鎵撳嵃 SH600765<br />
4  3D鎵撳嵃 SH600806<br />
5  3D鎵撳嵃 SH601313<br />
6  3D鎵撳嵃 SH603002<br />
7  3D鎵撳嵃 SZ000988<br />
8  3D鎵撳嵃 SZ002008<br />
9  3D鎵撳嵃 SZ002117<br />
10 3D鎵撳嵃 SZ002189<br />


3.执行查询函数 乱码中文的参数.将错就错
<br />
> getIndexComp('3D鎵撳嵃')<br />
[1] "select blkname,secode from indst_classify where blkname like '3D鎵撳嵃%' ORDER BY secode limit 10"<br />
    blkname   secode<br />
1  3D鎵撳嵃 SH600071<br />
2  3D鎵撳嵃 SH600288<br />
3  3D鎵撳嵃 SH600765<br />
4  3D鎵撳嵃 SH600806<br />
5  3D鎵撳嵃 SH601313<br />
6  3D鎵撳嵃 SH603002<br />
7  3D鎵撳嵃 SZ000988<br />
8  3D鎵撳嵃 SZ002008<br />
9  3D鎵撳嵃 SZ002117<br />
10 3D鎵撳嵃 SZ002189<br />
</p>

是不是已经无语了?

对了再查看一次 sessionInfo()

<br />
> sessionInfo()<br />
R version 2.15.3 (2013-03-01)<br />
Platform: i386-w64-mingw32/i386 (32-bit)</p>
<p>locale:<br />
[1] LC_COLLATE=Chinese (Simplified)_People's Republic of China.936<br />
[2] LC_CTYPE=Chinese (Simplified)_People's Republic of China.936<br />
[3] LC_MONETARY=Chinese (Simplified)_People's Republic of China.936<br />
[4] LC_NUMERIC=C<br />
[5] LC_TIME=Chinese (Simplified)_People's Republic of China.936    </p>
<p>attached base packages:<br />
[1] stats     graphics  grDevices utils     datasets<br />
[6] methods   base     </p>
<p>other attached packages:<br />
[1] RPostgreSQL_0.4 DBI_0.2-7<br />
</p>

回复 第3楼 的 simbabest:

我感觉还有救。你试试这个:

getIndexComp(iconv("3D概念", "CP936", "UTF8"));<br />
iconv(getIndexComp('3D')$blkname, "UTF8", "CP936")
</p>

你的感觉是对的,真心有救了;再次表示感谢.

看来以后只能是

中文输入的地方就用:

iconv("中文","CP936","UTF8")


中文输出的地方就用:
iconv("乱码","UTF8","CP936")


还好有这个转码函数.要不然windows用户没法混了
</p>