3

文字列があるとします

s = "C:\Users\Eric\Desktop\beeline.txt"

そうでない場合は、Unicode に移行する必要があります。

return s if PY3 or type(s) is unicode else unicode(s, "unicode_escape")

文字列に \U (つまり、ユーザー ディレクトリ) が含まれる可能性がある場合、Unicode デコード エラーが発生する可能性があります。

UnicodeDecodeError: 'unicodeescape' codec can't decode bytes in position 3-4: truncated \UXXXXXXXX escape

次のように強制するだけで何か問題がありますか?

return s if PY3 or type(s) is unicode else unicode(s.encode('string-escape'), "unicode_escape")

または、\U の存在を明示的にチェックしていますか?

コードがpython 2と3の両方で機能するようにしたい.

4

3 に答える 3

0

以下のルーチンは、@yuvi による回答と精神的に似ていますが、複数のエンコーディング (構成可能) を通過し、使用されたエンコーディングを返します。また、エラー (basestring のもののみを変換して渡す) をより適切に処理します。

#unicode practice, this routine forces stringish objects to unicode
#preferring utf-8 but works through other encodings on error
#return values are the encoded string and the encoding used
def to_unicode_or_bust_multile_encodings(obj, encoding=['utf-8','latin-1','Windows-1252']):
  'noencoding'
  successfullyEncoded = False
  for elem in encoding:
    if isinstance(obj, basestring):
      if not isinstance(obj, unicode):
        try:
          obj = unicode(obj, elem)
          successfullyEncoded = True
          #if we succeed then exit early
          break
        except:
          #encoding did not work, try the next one
          pass

  if successfullyEncoded:
    return obj, elem
  else:
    return obj,'no_encoding_found'
于 2013-11-13T13:14:52.523 に答える
0

ユニコードに変換する適切な方法は何ですか?

ここにあります:

unicode_string = bytes_object.decode(character_encoding)

問題は次のようになります: 一連のバイトがあります。それらを Unicode 文字列に変換するには、どの文字エンコーディングを使用すればよいでしょうか?

答えは、バイトがどこから来るかによって異なります。

あなたの場合、バイト文字列はバイト文字列 (Python 2) の Python リテラルを使用して指定されるため、エンコーディングは Python ソース ファイルの文字エンコーディングです。ファイルの先頭に文字エンコーディング宣言がない場合 (: のようなコメント# -*- coding: utf-8 -*-)、デフォルトのソース エンコーディングは'ascii'Python 2 ( 'utf-8'-- Python 3) です。したがって、あなたの場合の答えは次のとおりです。

if isinstance(s, str) and not PY3:
   return s.decode('ascii')

または、Unicode リテラルを直接使用することもできます (Python 2 および Python 3.3+):

unicode_string = u"C:\\Users\\Eric\\Desktop\\beeline.txt"
于 2013-11-13T14:22:04.240 に答える