跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Flatly)
  • 不使用皮肤
折叠

Odoo 中文社区

  1. 主页
  2. 版块
  3. Odoo 开发与实施交流
  4. Oe 中字符串长度的问题

Oe 中字符串长度的问题

已定时 已固定 已锁定 已移动 Odoo 开发与实施交流
6 帖子 3 发布者 3.5k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • C 离线
    C 离线
    ccdos
    写于 最后由 编辑
    #1

    码农们 都知道, 一个汉字=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
    • mrshellyM 离线
      mrshellyM 离线
      mrshelly
      写于 最后由 编辑
      #2

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

      1 条回复 最后回复
      0
      • digitalsatoriD 离线
        digitalsatoriD 离线
        digitalsatori 管理员
        写于 最后由 编辑
        #3

        [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
        • mrshellyM 离线
          mrshellyM 离线
          mrshelly
          写于 最后由 编辑
          #4

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

          1 条回复 最后回复
          0
          • C 离线
            C 离线
            ccdos
            写于 最后由 编辑
            #5

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

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

            1 条回复 最后回复
            0

            • 登录

            • 没有帐号? 注册

            • 登录或注册以进行搜索。
            • 第一个帖子
              最后一个帖子
            0
            • 版块
            • 标签
            • 热门
            • 用户
            • 群组