Problem with lower() for unicode strings in russian

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Alexey Moskvin

    #1

    Problem with lower() for unicode strings in russian

    Hi!
    I have a set of strings (all letters are capitalized) at utf-8,
    russian language. I need to lower it, but
    my_string.lower (). Doesn't work.
    See sample script:
    # -*- coding: utf-8 -*-
    [skip]
    s1 = self.title
    s2 = self.title.lowe r()
    print s1 == s2

    returns true.
    I have no problems with lower() for english letters:, or with
    something like this:
    u'russian_lette rs_here'.lower( ), but I don't need constants, I need to
    modify variables, but there is no any changs, when I apply lower()
    function to mine strings.
  • Diez B. Roggisch

    #2
    Re: Problem with lower() for unicode strings in russian

    Alexey Moskvin schrieb:
    Hi!
    I have a set of strings (all letters are capitalized) at utf-8,
    russian language. I need to lower it, but
    my_string.lower (). Doesn't work.
    See sample script:
    # -*- coding: utf-8 -*-
    [skip]
    s1 = self.title
    s2 = self.title.lowe r()
    print s1 == s2
    >
    returns true.
    I have no problems with lower() for english letters:, or with
    something like this:
    u'russian_lette rs_here'.lower( ), but I don't need constants, I need to
    modify variables, but there is no any changs, when I apply lower()
    function to mine strings.
    Can you give a concrete example? I doubt that there is anything
    different between lowering a unicode object given as literal or acquired
    somewhere else. And because my russian skills equal my chinese - total
    of zero - I can't create a test myself :)

    Comment

    • =?ISO-8859-1?Q?=22Martin_v=2E_L=F6wis=22?=

      #3
      Re: Problem with lower() for unicode strings in russian

      I have a set of strings (all letters are capitalized) at utf-8,

      That's the problem. If these are really utf-8 encoded byte strings,
      then .lower likely won't work. It uses the C library's tolower API,
      which works on a byte level, i.e. can't work for multi-byte encodings.

      What you need to do is to operate on Unicode strings. I.e. instead
      of

      s.lower()

      do

      s.decode("utf-8").lower()

      or (if you need byte strings back)

      s.decode("utf-8").lower().enc ode("utf-8")

      If you find that you write the latter, I recommend that you redesign
      your application. Don't use byte strings to represent text, but use
      Unicode strings all the time, except at the system boundary (where
      you decode/encode as appropriate).

      There are some limitations with Unicode .lower also, but I don't
      think they apply to Russian (specifically, SpecialCasing.t xt is
      not considered).

      HTH,
      Martin

      Comment

      • Alexey Moskvin

        #4
        Re: Problem with lower() for unicode strings in russian

        Martin, thanks for fast reply, now anything is ok!
        On Oct 6, 1:30 am, "Martin v. Löwis" <mar...@v.loewi s.dewrote:
        I have a set of strings (all letters are capitalized) at utf-8,
        >
        That's the problem. If these are really utf-8 encoded byte strings,
        then .lower likely won't work. It uses the C library's tolower API,
        which works on a byte level, i.e. can't work for multi-byte encodings.
        >
        What you need to do is to operate on Unicode strings. I.e. instead
        of
        >
        s.lower()
        >
        do
        >
        s.decode("utf-8").lower()
        >
        or (if you need byte strings back)
        >
        s.decode("utf-8").lower().enc ode("utf-8")
        >
        If you find that you write the latter, I recommend that you redesign
        your application. Don't use byte strings to represent text, but use
        Unicode strings all the time, except at the system boundary (where
        you decode/encode as appropriate).
        >
        There are some limitations with Unicode .lower also, but I don't
        think they apply to Russian (specifically, SpecialCasing.t xt is
        not considered).
        >
        HTH,
        Martin

        Comment

        • konstantin

          #5
          Re: Problem with lower() for unicode strings in russian

          On Oct 6, 8:39 am, Alexey Moskvin <d...@inbox.ruw rote:
          Martin, thanks for fast reply, now anything is ok!
          On Oct 6, 1:30 am, "Martin v. Löwis" <mar...@v.loewi s.dewrote:
          >
          I have a set of strings (all letters are capitalized) at utf-8,
          >
          That's the problem. If these are really utf-8 encoded byte strings,
          then .lower likely won't work. It uses the C library's tolower API,
          which works on a byte level, i.e. can't work for multi-byte encodings.
          >
          What you need to do is to operate on Unicode strings. I.e. instead
          of
          >
          s.lower()
          >
          do
          >
          s.decode("utf-8").lower()
          >
          or (if you need byte strings back)
          >
          s.decode("utf-8").lower().enc ode("utf-8")
          >
          If you find that you write the latter, I recommend that you redesign
          your application. Don't use byte strings to represent text, but use
          Unicode strings all the time, except at the system boundary (where
          you decode/encode as appropriate).
          >
          There are some limitations with Unicode .lower also, but I don't
          think they apply to Russian (specifically, SpecialCasing.t xt is
          not considered).
          >
          HTH,
          Martin
          Alexey,

          if your strings stored in some text file you can use "codecs" package
          import codecs
          handler = codecs.open('so mefile', 'r', 'utf-8')
          # ... do the job
          handler.close()
          I prefer this way to deal with russian in utf-8.

          Konstantin.


          Comment

          Working...