복붙노트

[PYTHON] 파이썬 : 유니 코드 문자열을 살균 하시겠습니까? [복제]

PYTHON

파이썬 : 유니 코드 문자열을 살균 하시겠습니까? [복제]

내가 unicode () 함수에 대해 안전하게하려고 노력하고있는 문자열이 있습니다.

>>> s = " foo “bar bar ” weasel"
>>> s.encode('utf-8', 'ignore')

Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    s.encode('utf-8', 'ignore')
UnicodeDecodeError: 'ascii' codec can't decode byte 0x93 in position 5: ordinal not in range(128)
>>> unicode(s)

Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    unicode(s)
UnicodeDecodeError: 'ascii' codec can't decode byte 0x93 in position 5: ordinal not in range(128)

나는 거의 여기에서 휘젓고있다. 문자열에서 안전하지 않은 문자를 제거하려면 어떻게해야합니까?

이 문제와 관련하여 다소 문제가 있었지만 문제를 해결할 수는 없었습니다.

이것은 또한 실패합니다 :

>>> s
' foo \x93bar bar \x94 weasel'
>>> s.decode('utf-8')

Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    s.decode('utf-8')
  File "C:\Python25\254\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x93 in position 5: unexpected code byte

해결법

  1. ==============================

    1.좋은 질문. 인코딩 문제는 까다 롭습니다. "나는 문자열이 있습니다."라고 시작합시다. 파이썬 2의 문자열은 실제로 "문자열"이 아니며 바이트 배열입니다. 그래서 당신의 문자열, 그것은 어디서 왔고 어떤 인코딩이 되었습니까? 당신의 예는 문자 그대로 중괄호로 묶여있는 따옴표를 보여 주며, 나는 그것을 어떻게했는지조차 모르겠습니다. 나는 그것을 파이썬 인터프리터에 붙여 넣으려고 시도하거나, Option-[와 함께 OS X에 타이핑하여 입력한다.

    좋은 질문. 인코딩 문제는 까다 롭습니다. "나는 문자열이 있습니다."라고 시작합시다. 파이썬 2의 문자열은 실제로 "문자열"이 아니며 바이트 배열입니다. 그래서 당신의 문자열, 그것은 어디서 왔고 어떤 인코딩이 되었습니까? 당신의 예는 문자 그대로 중괄호로 묶여있는 따옴표를 보여 주며, 나는 그것을 어떻게했는지조차 모르겠습니다. 나는 그것을 파이썬 인터프리터에 붙여 넣으려고 시도하거나, Option-[와 함께 OS X에 타이핑하여 입력한다.

    두 번째 예제를 보면 16 진수 93 문자가 있습니다. UTF-8에서는 127보다 큰 바이트가 멀티 바이트 시퀀스의 일부이므로 UTF-8 일 수 없습니다. 그래서 저는 라틴 -1이라고 생각합니다. 문제는 x93이 Latin-1 문자 세트의 문자가 아니라는 것입니다. 불법으로 간주되는 x7f에서 x9f까지 라틴어 -1에이 "유효하지 않은"범위가 있습니다. 그러나 Microsoft는 사용되지 않는 범위를보고 거기에 "곱슬 머리글"을 넣기로 결정했습니다. 그렇게함으로써 그들은 "windows-1252"라고 불리는이 비슷한 인코딩을 만들었는데, 이것은 무효 범위의 내용을 가진 Latin-1과 비슷합니다.

    그러면 windows-1252라고 가정합시다. 지금 뭐야? String.decode는 바이트를 유니 코드로 변환하므로 원하는 것입니다. 두 번째 예제는 올바르지 만 문자열은 UTF-8이 아니기 때문에 실패했습니다. 시험:

    >>> uni = 'foo \x93bar bar\x94 weasel'.decode("windows-1252")
    u'foo \u201cbar bar\u201d weasel'
    >>> print uni
    foo “bar bar” weasel
    >>> type(uni)
    <type 'unicode'>
    

    중괄호를 여는 것은 유니 코드 U + 201C이기 때문에 맞습니다. Unicode가 생겼으므로 선택한 인코딩 (바이트를 전달할 필요가있는 경우)으로 바이트를 직렬화하거나 파이썬 내에 있으면 유니 코드로 유지할 수 있습니다. UTF-8로 변환하려면, 반대 함수 string.encode를 사용하십시오.

    >>> uni.encode("utf-8")
    'foo \xe2\x80\x9cbar bar \xe2\x80\x9d weasel'
    

    둥근 따옴표는 UTF-8로 인코딩하기 위해 3 바이트를 사용합니다. 당신은 UTF-16을 사용할 수 있고 그들은 단지 2 바이트 일 것입니다. 하지만 중괄호 따옴표가 없기 때문에 ASCII 또는 Latin-1로 인코딩 할 수 없습니다.

  2. ==============================

    2.편집하다. 문자열이 "(LEFT DOUBLE QUOTATION MARK)가 \ x93이되고"(RIGHT DOUBLE QUOTATION MARK)가 \ x94가되는 방식으로 인코딩 된 것 같습니다. 이러한 매핑을 사용하는 많은 코드 페이지가 있는데 CP1250이 그 중 하나이므로 다음과 같이 사용할 수 있습니다.

    편집하다. 문자열이 "(LEFT DOUBLE QUOTATION MARK)가 \ x93이되고"(RIGHT DOUBLE QUOTATION MARK)가 \ x94가되는 방식으로 인코딩 된 것 같습니다. 이러한 매핑을 사용하는 많은 코드 페이지가 있는데 CP1250이 그 중 하나이므로 다음과 같이 사용할 수 있습니다.

    s = s.decode('cp1250')
    

    "to \ x93 여기에 표시 (모두 \ x94로 매핑 할 수 있습니다. 여기에서 확인할 수 있습니다)"로 매핑되는 모든 코드 페이지에 적용됩니다.

  3. from https://stackoverflow.com/questions/3224427/python-sanitize-a-string-for-unicode by cc-by-sa and MIT license