programing

유니코드 문자열을 Python 문자열로 변환(추가 기호 포함)

shortcode 2023. 1. 19. 07:23
반응형

유니코드 문자열을 Python 문자열로 변환(추가 기호 포함)

유니코드 문자열(파운드 $ 등 추가 문자 포함)을 Python 문자열로 변환하려면 어떻게 해야 합니까?

참조

title = u"Klüft skräms inför på fédéral électoral große"
import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii', 'ignore')
'Kluft skrams infor pa federal electoral groe'

비 ASC 를 변환할 필요가 없는 경우는, ASCII 로의 인코딩을 사용할 수 있습니다.II 문자:

>>> a=u"aaaàçççñññ"
>>> type(a)
<type 'unicode'>
>>> a.encode('ascii','ignore')
'aaa'
>>> a.encode('ascii','replace')
'aaa???????'
>>>
>>> text=u'abcd'
>>> str(text)
'abcd'

문자열에 ASCII 문자만 포함되어 있는 경우.

Unicode 문자열이 있고 이를 파일 또는 기타 시리얼 형식으로 쓰려면 먼저 저장할 수 있는 특정 표현으로 인코딩해야 합니다.UTF-16(대부분의 Unicode 문자에 2바이트 사용)이나 UTF-8(문자에 따라 1~4바이트/코드포인트) 등, 일반적인 Unicode 인코딩이 몇개인가 있습니다.이 문자열을 특정 인코딩으로 변환하려면 다음을 사용합니다.

>>> s= u'£10'
>>> s.encode('utf8')
'\xc2\x9c10'
>>> s.encode('utf16')
'\xff\xfe\x9c\x001\x000\x00'

이 원시 바이트 문자열은 파일에 쓸 수 있습니다.단, 다시 읽을 때는 어떤 인코딩인지 알고 동일한 인코딩을 사용하여 디코딩해야 합니다.

파일에 쓸 때 코덱모듈을 사용하면 이 수동 부호화/복호화 프로세스를 제거할 수 있습니다.따라서 모든 Unicode 문자열을 UTF-8로 인코딩하는 파일을 열려면 다음 명령을 사용합니다.

import codecs
f = codecs.open('path/to/file.txt','w','utf8')
f.write(my_unicode_string)  # Stored on disk as UTF-8

이러한 파일을 사용하는 다른 사용자는 파일을 읽으려면 파일의 인코딩을 이해해야 합니다.읽기/쓰기를 혼자 하는 경우에는 문제가 되지 않습니다. 그렇지 않으면 파일을 사용하는 다른 사용자가 이해할 수 있는 형식으로 쓰십시오.

Python 3 에서는, 이러한 형식의 파일 액세스가 디폴트이며, 내장되어 있습니다.open함수는 인코딩 파라미터를 사용하여 텍스트모드로 열려 있는 파일에 대해 항상 Unicode 문자열(Python 3의 기본 문자열 개체)과 변환합니다.

다음은 예를 제시하겠습니다.

>>> u = u'€€€'
>>> s = u.encode('utf8')
>>> s
'\xe2\x82\xac\xe2\x82\xac\xe2\x82\xac'

파일에 Unicode로 이스케이프된 문자열이 포함되어 있습니다.

\"message\": \"\\u0410\\u0432\\u0442\\u043e\\u0437\\u0430\\u0446\\u0438\\u044f .....\",

나를 위해.

 f = open("56ad62-json.log", encoding="utf-8")
 qq=f.readline() 

 print(qq)                          
 {"log":\"message\": \"\\u0410\\u0432\\u0442\\u043e\\u0440\\u0438\\u0437\\u0430\\u0446\\u0438\\u044f \\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u0435\\u043b\\u044f\"}

(qq.encode().decode("unicode-escape").encode().decode("unicode-escape")) 
# '{"log":"message": "Авторизация пользователя"}\n'

Python 3으로 전환할 의향이 있거나 준비가 되어 있다면(일부 Python 2 코드와의 역호환성 때문이 아닐 수도 있음), 변환을 수행할 필요가 없습니다; Python 3의 모든 텍스트는 유니코드 문자열로 표시되며, 이는 또한 더 이상 Python 3을 사용하지 않는다는 것을 의미합니다.u'<text>'구문을 사용합니다.데이터(인코딩된 문자열일 수 있음)를 나타내기 위해 실제로 사용되는 바이트 문자열도 있습니다.

http://docs.python.org/3.1/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit

(물론 현재 Python 3을 사용하고 있다면 이 문제는 텍스트 파일을 저장하는 방법과 관련이 있을 수 있습니다.)

ftfy라고 불리는 유니코드 문제를 해결할 수 있는 라이브러리가 있습니다.그게 내 삶을 더 편하게 만들었어.

예 1

import ftfy
print(ftfy.fix_text('ünicode'))

output -->
ünicode

예 2 - UTF-8

import ftfy
print(ftfy.fix_text('\xe2\x80\xa2'))

output -->
•

예 3 - Unicode 코드 포인트

import ftfy
print(ftfy.fix_text(u'\u2026'))

output -->
…

https://ftfy.readthedocs.io/en/latest/

pip install ftfy

https://pypi.org/project/ftfy/

다음은 코드 예시입니다.

import unicodedata    
raw_text = u"here $%6757 dfgdfg"
convert_text = unicodedata.normalize('NFKD', raw_text).encode('ascii','ignore')

유니코드 문자를 포함한 문자열 변수가 있는 경우, 여기서 설명하는 인코딩 디코딩은 동작하지 않았습니다.

터미널에서 사용하는 경우

echo "no me llama mucho la atenci\u00f3n"

또는

python3
>>> print("no me llama mucho la atenci\u00f3n")

출력은 정확합니다.

output: no me llama mucho la atención

그러나 이 문자열 변수를 로드하는 스크립트는 작동하지 않았습니다.

이게 사건에서 효과가 있었던 야 혹시나 누군가를 도울 경우를 대비해서 말이야

string_to_convert = "no me llama mucho la atenci\u00f3n"
print(json.dumps(json.loads(r'"%s"' % string_to_convert), ensure_ascii=False))
output: no me llama mucho la atención

이것은 나의 기능이다.

import unicodedata
def unicode_to_ascii(note):
    str_map = {'Š' : 'S', 'š' : 's', 'Đ' : 'D', 'đ' : 'd', 'Ž' : 'Z', 'ž' : 'z', 'Č' : 'C', 'č' : 'c', 'Ć' : 'C', 'ć' : 'c', 'À' : 'A', 'Á' : 'A', 'Â' : 'A', 'Ã' : 'A', 'Ä' : 'A', 'Å' : 'A', 'Æ' : 'A', 'Ç' : 'C', 'È' : 'E', 'É' : 'E', 'Ê' : 'E', 'Ë' : 'E', 'Ì' : 'I', 'Í' : 'I', 'Î' : 'I', 'Ï' : 'I', 'Ñ' : 'N', 'Ò' : 'O', 'Ó' : 'O', 'Ô' : 'O', 'Õ' : 'O', 'Ö' : 'O', 'Ø' : 'O', 'Ù' : 'U', 'Ú' : 'U', 'Û' : 'U', 'Ü' : 'U', 'Ý' : 'Y', 'Þ' : 'B', 'ß' : 'Ss', 'à' : 'a', 'á' : 'a', 'â' : 'a', 'ã' : 'a', 'ä' : 'a', 'å' : 'a', 'æ' : 'a', 'ç' : 'c', 'è' : 'e', 'é' : 'e', 'ê' : 'e', 'ë' : 'e', 'ì' : 'i', 'í' : 'i', 'î' : 'i', 'ï' : 'i', 'ð' : 'o', 'ñ' : 'n', 'ò' : 'o', 'ó' : 'o', 'ô' : 'o', 'õ' : 'o', 'ö' : 'o', 'ø' : 'o', 'ù' : 'u', 'ú' : 'u', 'û' : 'u', 'ý' : 'y', 'ý' : 'y', 'þ' : 'b', 'ÿ' : 'y', 'Ŕ' : 'R', 'ŕ' : 'r'}
    for key, value in str_map.items():
        note = note.replace(key, value)
    asciidata = unicodedata.normalize('NFKD', note).encode('ascii', 'ignore')
    return asciidata.decode('UTF-8')

Unicode의 General_Category_Values(https://www.unicode.org/reports/tr44/#General_Category_Values)에 따라 유지할 내용을 제어할 수 있는 다음 함수를 만들었습니다.

def FormatToNameList(name_str):
    import unicodedata
    clean_str = ''
    for c in name_str:
        if unicodedata.category(c) in ['Lu','Ll']:
            clean_str += c.lower()
            print('normal letter: ',c)
        elif unicodedata.category(c) in ['Lt','Lm','Lo']:
            clean_str += c
            print('special letter: ',c)
        elif unicodedata.category(c) in ['Nd']:
            clean_str += c
            print('normal number: ',c)
        elif unicodedata.category(c) in ['Nl','No']:
            clean_str += c
            print('special number: ',c)
        elif unicodedata.category(c) in ['Cc','Sm','Zs','Zl','Zp','Pc','Pd','Ps','Pe','Pi','Pf','Po']:
            clean_str += ' '
            print('space or symbol: ',c)
        else:
            print('other: ',' : ',c,' unicodedata.category: ',unicodedata.category(c))    
    name_list = clean_str.split(' ')
    return clean_str, name_list
if __name__ == '__main__':
     u = 'some3^?"Weirdstr '+ chr(231) + chr(0x0af4)
     [clean_str, name_list] = FormatToNameList(u)
     print(clean_str)
     print(name_list)

https://docs.python.org/3/howto/unicode.html 도 참조해 주세요.

언급URL : https://stackoverflow.com/questions/1207457/convert-a-unicode-string-to-a-string-in-python-containing-extra-symbols

반응형