Odoo 中文社区

    • 注册
    • 登录
    • 搜索
    • 版块
    • 标签
    • 热门
    • 用户
    • 群组

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

    由于系统升迁的原因,本论坛部分较早期的内容存在格式和链接损坏失效的问题,并非本论坛系统本身的缺陷,望谅解

    本社区没有维护任何QQ群讨论组,任何与本社区同名的QQ群讨论组的言论与本社区无关!

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

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

    Oe 中字符串长度的问题

    Odoo 开发与实施交流
    3
    6
    2871
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • C
      ccdos 最后由 编辑

      码农们 都知道, 一个汉字=2个字节, 所以定义长度的时候 都是 所需汉字数 × 2.

      今天群里 有人问起.

      因为想到 现在我们都是在 玩 utf-8 了,

      于是测试了一下, 用 中文社区的 开发代码示例

      &nbsp; &nbsp; &nbsp;  &#039;name&#039;:fields.char( u&#039;课程名&#039;,size=20,select=True),<br />
      



      安装完成后 输入的结果是这样的, 每行 我都输入到 不能输入保存为止

      结果是这样的


      [attachimg=1]



      再去 数据库 查看, 结果是

      [attachimg=2]

      [attachimg=3]




      ~~~~~~~~~~~~~~~`

      不太精确的 结论

      用了 utf 8 以后,  老黄历就不对了

      现在 一个汉字= 一个英文字符


      为什么说不太精确呢,
      仔细数数, 用了汉字后, 明明最长 只有 19个,

      这是为嘛呢 ?

      大家有兴趣就继续研究吧

      1 条回复 最后回复 回复 引用 0
      • mrshelly
        mrshelly 最后由 编辑

        我猜会不会有BOM头也在字段前加进去了?

        1 条回复 最后回复 回复 引用 0
        • digitalsatori
          digitalsatori 管理员 最后由 编辑

          [quote author=ccdos link=topic=14629.msg25331#msg25331 date=1384689915]
          码农们 都知道, 一个汉字=2个字节, 所以定义长度的时候 都是 所需汉字数 × 2.

          ~~~~~~~~~~~~~~~`

          不太精确的 结论

          用了 utf 8 以后,  老黄历就不对了

          现在 一个汉字= 一个英文字符


          为什么说不太精确呢,
          仔细数数, 用了汉字后, 明明最长 只有 19个,

          这是为嘛呢 ?

          大家有兴趣就继续研究吧
          [/quote]

          码农们真的都这么想? ???

          一个字符在电脑中存储的长度取决于其所使用的编码。你所说的一个汉字2个字节,估计是说用GB2312或GBK编码的汉字,用utf-8编码的汉字就可能是3个字节或更长:

          In [1]: len(u&#039;中&#039;.encode(&#039;utf8&#039;)), len(u&#039;中&#039;.encode(&#039;gbk&#039;))&nbsp;  #分别用utf-8和gbk编码汉字“中”,看它们分别的长度是多少<br />Out[1]: (3, 2)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #utf-8编码的“中” 3个字节, gbk编码的为码农们谁用谁知道的2字节<br />
          



          那么对于兄弟在帖子里提到的问题,(除了精确不精确之说,精确之说只因为兄弟眼神有点不济, 😉 ),pgsql中varchar定义的长度,和兄弟使用length函数返回的长度,实际上都是unicode字符的个数,而不是字符的字节数:

          show client_encoding;<br /> client_encoding <br />-----------------<br /> UTF8<br />(1 row)<br /><br />V7_CRM=&gt; select char_length(&#039;中&#039;), bit_length(&#039;中&#039;);<br /> char_length | bit_length <br />-------------+------------<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  1 |&nbsp; &nbsp; &nbsp; &nbsp;  24<br />(1 row)<br /><br />
          



          对于字串的编码的确是很容易搞混的,这也是很多弟兄面对OpenERP中经常出现的decoding, encoding错误束手无策的原因,推荐看看下面的文章:
          http://blog.csdn.net/fmddlmyy/article/details/1868313

          特别是这篇,
          http://www.joelonsoftware.com/articles/Unicode.html

          【上海先安科技】(tony AT openerp.cn)

          1 条回复 最后回复 回复 引用 0
          • mrshelly
            mrshelly 最后由 编辑

            赞...........

            1 条回复 最后回复 回复 引用 0
            • C
              ccdos 最后由 编辑

              校长说得很对 , 但是 有个疑惑依旧没解决。

              我确实数的是 unicode 的字符个数,
              在 lenght 都是 20 的情况下,  有了中文后,字符数就少了一个

              1 条回复 最后回复 回复 引用 0
              • First post
                Last post