Python gbk编码 怎么处理偏僻字?

forevertali 2012-05-16 10:23:04
使用python 把数据从oracle 数据库数据同步到mysql 中,mysql 编码为utf-8 ,在python代码中使用decode("gbk").encode("utf-8") 来将汉子转换,但是遇到偏僻字。。。就会转换失败,
if var is None:
return 'NULL';
else:
return str(var).decode('gbk').encode('utf-8');

在网上找到可以把错误忽略,但是 经测试,发现返回的数据为空:
return str(var).decode('gbk','ignore').encode('utf-8');

能否有解决方法 或者 其他想法?
...全文
670 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
angel_su 2012-05-16
  • 打赏
  • 举报
回复
你不能把看到错的那个字复制变成代码打进去,直接用你原来的代码跑...
bugs2k 2012-05-16
  • 打赏
  • 举报
回复
貌似3字节的转换都会出错?
bugs2k 2012-05-16
  • 打赏
  • 举报
回复
>>> s = ""
>>>
>>> s
'\xee\xa1\xa3'
>>>
forevertali 2012-05-16
  • 打赏
  • 举报
回复
或者有没有其他同步数据的方案,或者例子
forevertali 2012-05-16
  • 打赏
  • 举报
回复
主要是不能覆盖全部的。。 那些名字的 生僻字。。。。 真心很纠结
薛定谔之死猫 2012-05-16
  • 打赏
  • 举报
回复
多换集中编码尝试下,一般GBK都覆盖了简体中文的所有汉字的,不行可以看看CP936,GB2312之类的~
forevertali 2012-05-16
  • 打赏
  • 举报
回复
打出来的数据为:
'\xfe\x9f'
forevertali 2012-05-16
  • 打赏
  • 举报
回复
def mystr(var):
if var is None:
return 'NULL';
else:
print repr(var)
return str(var).decode('gbk','ignore').encode('utf-8');
if __name__ == "__main__":
s = ''
s1 = mystr(s);
print s1
angel_su 2012-05-16
  • 打赏
  • 举报
回复
试试打印出var看看实际内容...
else:
print repr(var)
return str(var).decode('gbk').encode('utf-8')
forevertali 2012-05-16
  • 打赏
  • 举报
回复
var 是一个输入参数, 呵呵 不好意思 代码没贴完整
def mystr(var):
if var is None:
return 'NULL';
else:
return str(var).decode('gbk').encode('utf-8');
angel_su 2012-05-16
  • 打赏
  • 举报
回复
var是什么,看起来str(var)没啥道理...
forevertali 2012-05-16
  • 打赏
  • 举报
回复
类似于 “” 就会报错
forevertali 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 的回复:]
碰到字符型的数据不要随便str(),不然很容易出问题的,因为一旦字符串里有ascii,str()这个函数就会报错,你要先判断var的类型,如果的__class__或者type(),检测数据类型,费字符串类型的数据是不用转码的,一般只有unicode的类型要处理,var.decode('gbk').encode('utf-8');不要随便str(),不然容易报错
[/Quote]
我也不想用 但是 使用python 转库程序,如果不转 就会出现乱码,有没有好的建议啊
tim_spac_126 2012-05-16
  • 打赏
  • 举报
回复
$ python
Python 2.7.2+ (default, Oct 4 2011, 20:03:08)
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> # encoding: utf-8
...
>>> a = '\xfe\x9f'
>>> b = a.decode('gbk')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'gbk' codec can't decode bytes in position 0-1: illegal multibyte sequence
>>> b = a.decode('gb18030')
>>> codings = ['gbk','gb18030','gb2312','cp936']
>>> def tryDecode(c):
... for coding in codings:
... try:
... return c.decode(coding)
... except:
... pass
... else:
... print 'decode Chinese error;'
...
>>> tryDecode(a)
u'\u4dae'
bijie521yl 2012-05-16
  • 打赏
  • 举报
回复
碰到字符型的数据不要随便str(),不然很容易出问题的,因为一旦字符串里有ascii,str()这个函数就会报错,你要先判断var的类型,如果的__class__或者type(),检测数据类型,费字符串类型的数据是不用转码的,一般只有unicode的类型要处理,var.decode('gbk').encode('utf-8');不要随便str(),不然容易报错

forevertali 2012-05-16
  • 打赏
  • 举报
回复
恩 谢谢了 。 这个是翻译过来了。
但是现在目标数据库MYSQL 里面的编码方式为utf-8 应该没有影响吧。到时候取出来不会是乱码吧?
bugs2k 2012-05-16
  • 打赏
  • 举报
回复
呵呵,字搞错了。貌似你应该用 gb18030 编码格式的,如下:

Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2
Type "copyright", "credits" or "license()" for more information.
==== No Subprocess ====
>>> a = '\xfe\x9f'
>>> b = a.decode('gb18030')
>>> c = b.encode('utf-8')
>>> a,b,c
('\xfe\x9f', u'\u4dae', '\xe4\xb6\xae')
>>> print a,b,c
þ゚ 䶮 䶮
>>>

angel_su 2012-05-16
  • 打赏
  • 举报
回复
这个飞龙在天是比较奇怪,网搜了下要用mbcs编码,貌似只能在windows下用,mbcs同gbk有啥不一样我也搞不懂...
>>> s = '\xfe\x9f'
>>> u = s.decode('gbk')

Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
u = s.decode('gbk')
UnicodeDecodeError: 'gbk' codec can't decode bytes in position 0-1: illegal multibyte sequence
>>> u = s.decode('mbcs')
>>> u
u'\ue863'
>>> u.encode('utf-8')
'\xee\xa1\xa3'
>>>
forevertali 2012-05-16
  • 打赏
  • 举报
回复
能够取到这个字的父母 都是有学问的。。
bugs2k 2012-05-16
  • 打赏
  • 举报
回复
>>> x = '\xb9\xa8'
>>> y = x.decode('gbk')
>>> print y

>>>
加载更多回复(3)

37,741

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧