Odoo中文社区可以通过以下三个域名访问:shine-it.net , odoocn.org,odoo.net.cn

原论坛用户的基本信息和发帖这里都予以保留,请注意:原论坛用户无需重新注册新用户,但是您的密码需要重置

开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

如果您登录系统碰到问题,请在微信公众号留言:

Oe 中字符串长度的问题



  • 码农们 都知道, 一个汉字=2个字节, 所以定义长度的时候 都是 所需汉字数 × 2. <br /><br />今天群里 有人问起. <br /><br />因为想到 现在我们都是在 玩 utf-8 了,<br /><br />于是测试了一下, 用 中文社区的 开发代码示例<br /><br />[code]      'name':fields.char( u'课程名',size=20,select=True),<br />[/code]<br /><br />安装完成后 输入的结果是这样的, 每行 我都输入到 不能输入保存为止<br /><br />结果是这样的<br /><br /><br />[attachimg=1]<br /><br /><br /><br />再去 数据库 查看, 结果是 <br /><br />[attachimg=2]<br /><br />[attachimg=3]<br /><br /><br /><br /><br />~~~~~~~~~~~~~~~`<br /><br />不太精确的 结论<br /><br />用了 utf 8 以后,  老黄历就不对了<br /><br />现在 一个汉字= 一个英文字符<br /><br /><br />为什么说不太精确呢,<br />仔细数数, 用了汉字后, 明明最长 只有 19个,<br /><br />这是为嘛呢 ?<br /><br />大家有兴趣就继续研究吧



  • 码农们 都知道, 一个汉字=2个字节, 所以定义长度的时候 都是 所需汉字数 × 2. <br /><br />今天群里 有人问起. <br /><br />因为想到 现在我们都是在 玩 utf-8 了,<br /><br />于是测试了一下, 用 中文社区的 开发代码示例<br /><br />[code]      'name':fields.char( u'课程名',size=20,select=True),<br />[/code]<br /><br />安装完成后 输入的结果是这样的, 每行 我都输入到 不能输入保存为止<br /><br />结果是这样的<br /><br /><br />[attachimg=1]<br /><br /><br /><br />再去 数据库 查看, 结果是 <br /><br />[attachimg=2]<br /><br />[attachimg=3]<br /><br /><br /><br /><br />~~~~~~~~~~~~~~~`<br /><br />不太精确的 结论<br /><br />用了 utf 8 以后,  老黄历就不对了<br /><br />现在 一个汉字= 一个英文字符<br /><br /><br />为什么说不太精确呢,<br />仔细数数, 用了汉字后, 明明最长 只有 19个,<br /><br />这是为嘛呢 ?<br /><br />大家有兴趣就继续研究吧



  • 我猜会不会有BOM头也在字段前加进去了?<br /><br />


  • 管理员

    [quote author=ccdos link=topic=14629.msg25331#msg25331 date=1384689915]<br />码农们 都知道, 一个汉字=2个字节, 所以定义长度的时候 都是 所需汉字数 × 2. <br /><br />~~~~~~~~~~~~~~~`<br /><br />不太精确的 结论<br /><br />用了 utf 8 以后,  老黄历就不对了<br /><br />现在 一个汉字= 一个英文字符<br /><br /><br />为什么说不太精确呢,<br />仔细数数, 用了汉字后, 明明最长 只有 19个,<br /><br />这是为嘛呢 ?<br /><br />大家有兴趣就继续研究吧<br />[/quote]<br /><br />码农们真的都这么想? ??? <br /><br />一个字符在电脑中存储的长度取决于其所使用的编码。你所说的一个汉字2个字节,估计是说用GB2312或GBK编码的汉字,用utf-8编码的汉字就可能是3个字节或更长:<br />[code]In [1]: len(u'中'.encode('utf8')), len(u'中'.encode('gbk'))  #分别用utf-8和gbk编码汉字“中”,看它们分别的长度是多少<br />Out[1]: (3, 2)                                                            #utf-8编码的“中” 3个字节, gbk编码的为码农们谁用谁知道的2字节<br />[/code]<br /><br />那么对于兄弟在帖子里提到的问题,(除了精确不精确之说,精确之说只因为兄弟眼神有点不济, ;) ),pgsql中varchar定义的长度,和兄弟使用length函数返回的长度,实际上都是unicode字符的个数,而不是字符的字节数:<br />[code]show client_encoding;<br /> client_encoding <br />-----------------<br /> UTF8<br />(1 row)<br /><br />V7_CRM=> select char_length('中'), bit_length('中');<br /> char_length | bit_length <br />-------------+------------<br />          1 |        24<br />(1 row)<br /><br />[/code]<br /><br />对于字串的编码的确是很容易搞混的,这也是很多弟兄面对OpenERP中经常出现的decoding, encoding错误束手无策的原因,推荐看看下面的文章:<br />[url=http://blog.csdn.net/fmddlmyy/article/details/1868313]http://blog.csdn.net/fmddlmyy/article/details/1868313[/url]<br /><br />特别是这篇,<br />[url=http://www.joelonsoftware.com/articles/Unicode.html]http://www.joelonsoftware.com/articles/Unicode.html[/url]



  • 赞...........



  • 校长说得很对 , 但是 有个疑惑依旧没解决。<br /><br />我确实数的是 unicode 的字符个数, <br />在 lenght 都是 20 的情况下,  有了中文后,字符数就少了一个


登录后回复
 

与 Odoo 中文社区 的连接断开,我们正在尝试重连,请耐心等待