바이트를 문자열로 변환


2306

이 코드를 사용하여 외부 프로그램에서 표준 출력을 얻습니다.

>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]

communi () 메소드는 바이트 배열을 리턴합니다.

>>> command_stdout
b'total 0\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2\n'

그러나 출력을 일반 Python 문자열로 사용하고 싶습니다. 다음과 같이 인쇄 할 수 있습니다.

>>> print(command_stdout)
-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1
-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2

나는 그것이 binascii.b2a_qp () 메소드에 대한 것이라고 생각 했지만 시도했을 때 동일한 바이트 배열을 다시 얻었습니다.

>>> binascii.b2a_qp(command_stdout)
b'total 0\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2\n'

바이트 값을 다시 문자열로 어떻게 변환합니까? "배터리"를 수동으로 사용하는 대신 사용하는 것입니다. 그리고 파이썬 3에서도 괜찮기를 바랍니다.


47
왜 작동하지 str(text_bytes)않습니까? 이것은 나에게 기괴한 것 같습니다.
Charlie Parker

13
@CharlieParker str(text_bytes)인코딩을 지정할 수 없기 때문에 . text_bytes의 내용에 따라 text_bytes.decode('cp1250)` 는와 (과 ) 매우 다른 문자열을 초래할 수 있습니다 text_bytes.decode('utf-8').
Craig Anderson

6
따라서 str함수는 더 이상 실제 문자열로 변환되지 않습니다. 어떤 이유로 든 명시 적으로 인코딩을 말해야하는 이유는 무엇입니까? 그냥 변환하고 utf-8ur 코드가 작동하는지 확인하십시오. 예var = var.decode('utf-8')
Charlie Parker

1
@CraigAnderson : unicode_text = str(bytestring, character_encoding)파이썬 3. 비록 예상대로 작품은 unicode_text = bytestring.decode(character_encoding)단지와 혼동을 피하기 위해 더 바람직하다 str(bytes_obj)위한 텍스트 표현을 생성하는 bytes_obj대신 텍스트로 디코딩 : str(b'\xb6', 'cp1252') == b'\xb6'.decode('cp1252') == '¶'str(b'\xb6') == "b'\\xb6'" == repr(b'\xb6') != '¶'
JFS

답변:


3673

문자열을 생성하려면 bytes 객체를 디코딩해야합니다.

>>> b"abcde"
b'abcde'

# utf-8 is used here because it is a very common encoding, but you
# need to use the encoding your data is actually in.
>>> b"abcde".decode("utf-8") 
'abcde'

58
사용하는 "windows-1252"것도 신뢰할 수 없습니다 (예를 들어, 다른 언어 버전의 Windows), 사용하는 것이 가장 좋지 sys.stdout.encoding않습니까?
nikow

12
어쩌면 이것은 누군가를 도울 것입니다 : 때로는 TCP 통신을 위해 바이트 배열을 사용합니다. 바이트 배열을 문자열로 변환하여 후행 '\ x00'문자를 잘라내려면 다음 대답으로는 충분하지 않습니다. 그런 다음 b'example \ x00 \ x00'.decode ( 'utf-8'). strip ( '\ x00')을 사용하십시오.
Wookie88

2
bugs.python.org/issue17860 에서 문서화에 관한 버그를 채웠습니다 . 패치를 자유롭게 제안하십시오. 기여하기 어려운 경우-개선 방법에 대한 의견을 환영합니다.
anatoly techtonik

44
파이썬 2.7.6에서는 b"\x80\x02\x03".decode("utf-8")-> 처리하지 않습니다 UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 0: invalid start byte.
martineau

9
내용이 임의의 이진 값이면 utf-8변환이 실패 할 수 있습니다. 대신 @techtonik 답변 (아래)을 참조하십시오 stackoverflow.com/a/27527728/198536
wallyk

214

바이트 문자열을 디코딩하여 문자 (유니 코드) 문자열로 바꿔야합니다.

파이썬 2에서

encoding = 'utf-8'
'hello'.decode(encoding)

또는

unicode('hello', encoding)

파이썬 3에서

encoding = 'utf-8'
b'hello'.decode(encoding)

또는

str(b'hello', encoding)

2
파이썬 3에서 문자열이 변수에 있다면?
Alaa M.

1
@AlaaM .: 동일합니다. 당신이있는 경우 variable = b'hello', 다음unicode_text = variable.decode(character_encoding)
JFS

182

나는이 방법이 쉽다고 생각한다.

>>> bytes_data = [112, 52, 52]
>>> "".join(map(chr, bytes_data))
'p44'

6
고맙습니다. 다른 방법이 없었을 때 방법이 저에게 효과적이었습니다. 인코딩되지 않은 바이트 배열이있어 문자열로 전환해야했습니다. 문자열로 디코딩 할 수 있도록 다시 인코딩하는 방법을 찾으려고했습니다. 이 방법은 완벽하게 작동합니다!
leetNightshade

5
@leetNightshade : 아직 비효율적입니다. 바이트 배열이 있으면 디코딩 만하면됩니다.
Martijn Pieters

12
@Martijn Pieters 나는 다른 답변으로 간단한 벤치 마크를 수행하여 10,000 번 실행 여러 번 실행 stackoverflow.com/a/3646405/353094 위의 솔루션은 실제로 매번 훨씬 빨랐습니다. Python 2.7.7에서 10,000 회 실행하는 데 8ms가 걸리고 다른 것들은 12ms와 18ms가 걸립니다. 입력, 파이썬 버전 등에 따라 약간의 변형이있을 수 있습니다. 나에게 너무 느리지 않습니다.
leetNightshade

5
@Martijn Pieters 예. 따라서 그 시점에서 이것은 질문 된 질문의 본문에 가장 적합한 대답은 아닙니다. 제목이 오도되지 않습니까? 바이트 배열을 문자열로 변환하지 않고 바이트 문자열을 일반 문자열로 변환하려고합니다. 이 답변은 질문의 제목에 적합합니다.
leetNightshade

5
파이썬 3의 경우 이것은 다음과 같아야합니다. bytes([112, 52, 52])-btw 바이트는 p3 내장이기 때문에 로컬 변수에 대한 잘못된 이름입니다.
Mr_and_Mrs_D

92

인코딩을 모르는 경우 Python 3 및 Python 2 호환 방식으로 이진 입력을 문자열로 읽으려면 고대 MS-DOS CP437 인코딩을 사용하십시오.

PY3K = sys.version_info >= (3, 0)

lines = []
for line in stream:
    if not PY3K:
        lines.append(line)
    else:
        lines.append(line.decode('cp437'))

인코딩을 알 수 없으므로 영어 이외의 기호는 다음 문자로 변환 될 것으로 예상합니다 cp437(영어 문자는 대부분의 단일 바이트 인코딩 및 UTF-8에서 일치하므로 변환되지 않습니다).

임의의 이진 입력을 UTF-8로 디코딩하는 것은 안전하지 않습니다.

>>> b'\x00\x01\xffsd'.decode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 2: invalid
start byte

latin-1파이썬 2에서 널리 사용되는 (기본값?) 코드 에도 동일하게 적용됩니다 . 코드 페이지 레이아웃 에서 누락 된 부분을보십시오 ordinal not in range. 파이썬이 악명 높게 질식하는 곳 입니다.

UPDATE 20150604 : Python 3에는 surrogateescape데이터 손실 및 충돌없이 바이너리 데이터로 물건을 인코딩 하는 데 오류 전략 이 있다는 소문이 있지만 [binary] -> [str] -> [binary]성능과 안정성을 모두 검증 하려면 변환 테스트가 필요합니다 .

UPDATE 20170116 : Nearoo의 의견 덕분에 backslashreplace오류 처리기로 알 수없는 모든 바이트를 이스케이프 처리 할 수 있습니다. 그것은 Python 3에서만 작동 하므로이 해결 방법으로도 다른 Python 버전에서 일관성없는 출력을 얻을 수 있습니다.

PY3K = sys.version_info >= (3, 0)

lines = []
for line in stream:
    if not PY3K:
        lines.append(line)
    else:
        lines.append(line.decode('utf-8', 'backslashreplace'))

자세한 내용은 Python의 유니 코드 지원 을 참조하십시오.

업데이트 20170119 : Python 2와 Python 3 모두에서 작동하는 슬래시 이스케이프 디코딩을 구현하기로 결정했습니다. cp437솔루션 보다 느려 야하지만 모든 Python 버전에서 동일한 결과 를 생성해야합니다 .

# --- preparation

import codecs

def slashescape(err):
    """ codecs error handler. err is UnicodeDecode instance. return
    a tuple with a replacement for the unencodable part of the input
    and a position where encoding should continue"""
    #print err, dir(err), err.start, err.end, err.object[:err.start]
    thebyte = err.object[err.start:err.end]
    repl = u'\\x'+hex(ord(thebyte))[2:]
    return (repl, err.end)

codecs.register_error('slashescape', slashescape)

# --- processing

stream = [b'\x80abc']

lines = []
for line in stream:
    lines.append(line.decode('utf-8', 'slashescape'))

6
파이썬이 누락 된 기호를 바꾸고 계속하는 메커니즘을 제공해야한다고 생각합니다.
anatoly techtonik 2012

@techtonik : python2에서 작동하는 것처럼 배열에서 작동하지 않습니다.
user2284570

@ user2284570 목록을 의미합니까? 그리고 왜 배열에서 작동해야합니까? 특히 수레의 배열.
anatoly techtonik

b'\x00\x01\xffsd'.decode('utf-8', 'ignore')파이썬 3에서 유니 코드 오류를 무시할 수도 있습니다.
Antonis Kalou

3
@anatolytechtonik 문자열에 이스케이프 시퀀스를 남겨두고 이동할 b'\x80abc'.decode("utf-8", "backslashreplace")수 있습니다 '\\x80abc'. 이 정보는 이 답변을 작성한 후 업데이트 된 것으로 보이는 유니 코드 설명서 페이지 에서 가져 왔습니다.
Nearoo

86

Python 3 에서 기본 인코딩은입니다 "utf-8". 직접 사용할 수 있습니다.

b'hello'.decode()

어느 것이

b'hello'.decode(encoding="utf-8")

반면 에 Python 2 에서는 인코딩이 기본 문자열 인코딩으로 기본 설정됩니다. 따라서 다음을 사용해야합니다.

b'hello'.decode(encoding)

encoding원하는 인코딩은 어디에 있습니까?

참고 : 키워드 인수에 대한 지원은 Python 2.7에서 추가되었습니다.


41

나는 당신이 실제로 이것을 원한다고 생각합니다 :

>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
>>> command_text = command_stdout.decode(encoding='windows-1252')

아론의 대답은 당신 사용 인코딩. 그리고 Windows는 'windows-1252'를 사용한다고 생각합니다. 콘텐츠에 비정상적인 (ASCII 이외의) 문자가있는 경우에만 문제가되지만 차이가 있습니다.

그런데,이 사실 않습니다 문제는 이유는 파이썬 바이너리와 텍스트 데이터에 대한 서로 다른 두 가지 유형을 사용하여 이동한다는 것입니다 : 당신이 그것을 말하지 않는 한 인코딩을 모르고 있기 때문에, 그들 사이에 마술 변환 할 수 없습니다! 아는 유일한 방법은 Windows 설명서를 읽거나 여기를 읽는 것입니다.


3
open()텍스트 스트림에 대한 함수 또는 Popen()전달하면 universal_newlines=True마술처럼 문자 인코딩을 결정합니다 ( locale.getpreferredencoding(False)Python 3.3 이상).
jfs

2
'latin-1'는 모든 코드 포인트가 설정된 그대로의 인코딩이므로 파이썬이 지원하는 문자열 유형 (파이썬 2에서는 그대로, 파이썬 3에서는 유니 코드로)으로 바이트 문자열을 효과적으로 읽을 수 있습니다.
tripleee 2012

@tripleee : mojibake 'latin-1'를 얻는 좋은 방법입니다. 또한 Windows에서 마법의 대체가 있습니다 : 그것은, 하나 개의 프로세스에서 다른 수정되지 않은 예에 파이프 데이터에 의외로 단단하다 dir: \xb6-> \x14(내 대답의 끝 부분에있는 예)
JFS

32

universal_newlines를 True로 설정하십시오.

command_stdout = Popen(['ls', '-l'], stdout=PIPE, universal_newlines=True).communicate()[0]

5
이 방법을 사용하고 있으며 작동합니다. 시스템의 사용자 기본 설정을 기반으로 인코딩을 추측하기 때문에 다른 옵션만큼 강력하지 않습니다. 이것이 docs.python.org/3.4/library/subprocess.html을 참조하여 수행하는 작업입니다. "universal_newlines가 True 인 경우 [stdin, stdout 및 stderr]는 로케일이 리턴 한 인코딩을 사용하여 범용 개행 모드에서 텍스트 스트림으로 열립니다. .getpreferredencoding (False). "
twasbrillig

3.7 에서는 text=True대신 대신 할 수 있습니다 universal_newlines=True.
보리스

23

@Aaron Maenpaa의 답변 이 효과가 있지만 최근 에 사용자가 물었습니다 .

더 간단한 방법이 있습니까? 'fhand.read (). decode ( "ASCII")'[...] 너무 깁니다!

당신이 사용할 수있는:

command_stdout.decode()

decode()표준 인수를 :

codecs.decode(obj, encoding='utf-8', errors='strict')


.decode()사용 'utf-8'이 실패 할 수 있습니다 (명령 출력에 다른 문자 인코딩이 사용되거나 결정 불가능한 바이트 시퀀스를 리턴 할 수도 있음). 입력이 ASCII (utf-8의 하위 세트) 인 경우 .decode()작동합니다.
jfs

22

바이트 시퀀스를 텍스트로 해석하려면 해당 문자 인코딩을 알아야합니다.

unicode_text = bytestring.decode(character_encoding)

예:

>>> b'\xc2\xb5'.decode('utf-8')
'µ'

ls명령은 텍스트로 해석 할 수없는 출력을 생성 할 수 있습니다. Unix의 파일 이름은 슬래시 b'/'와 0을 제외한 모든 바이트 시퀀스 일 수 있습니다 b'\0'.

>>> open(bytes(range(0x100)).translate(None, b'\0/'), 'w').close()

utf-8 인코딩을 사용하여 이러한 바이트 수프를 디코딩하려고하면 발생 UnicodeDecodeError합니다.

더 나빠질 수 있습니다. 호환되지 않는 잘못된 인코딩을 사용하면 디코딩이 자동으로 실패하고 mojibake 가 생성 될 수 있습니다.

>>> '—'.encode('utf-8').decode('cp1252')
'—'

데이터가 손상되었지만 프로그램은 오류가 발생했다는 것을 인식하지 못합니다.

일반적으로 사용할 문자 인코딩은 바이트 시퀀스 자체에 포함되지 않습니다. 이 정보를 대역 외로 전달해야합니다. 일부 결과는 다른 결과보다 가능성이 높으므로 문자 인코딩을 추측chardet 할 수있는 모듈이 있습니다 . 단일 Python 스크립트는 다른 위치에서 여러 문자 인코딩을 사용할 수 있습니다.


ls출력은 결정 불가능한 파일 이름 ( 유닉스에서 사용 및 오류 처리기) os.fsdecode() 에도 성공 하는 함수를 사용하여 Python 문자열로 변환 할 수 있습니다 .sys.getfilesystemencoding()surrogateescape

import os
import subprocess

output = os.fsdecode(subprocess.check_output('ls'))

원래 바이트를 얻으려면을 사용할 수 있습니다 os.fsencode().

universal_newlines=True매개 변수를 전달하면 바이트를 디코딩하는 subprocess데 사용 locale.getpreferredencoding(False)됩니다 (예 : cp1252Windows에 있음).

에 - 더 - 플라이 바이트 스트림 디코딩하는 데 io.TextIOWrapper() 사용될 수를 : .

다른 명령은 출력에 다른 문자 인코딩을 사용할 수 있습니다. 예를 들어 dir내부 명령 ( cmd)은 cp437을 사용할 수 있습니다. 출력을 디코딩하려면 인코딩을 명시 적으로 전달할 수 있습니다 (Python 3.6 이상).

output = subprocess.check_output('dir', shell=True, encoding='cp437')

파일 이름은 os.listdir()(Windows 유니 코드 API를 사용 하는) 파일과 다를 '\xb6'수 있습니다. 예를 들어, U + 00B6 (¶) 대신 문자 U + 0014를 제어하기 위해 '\x14'—Python의 cp437 코덱 맵 으로 대체 될 수 있습니다 b'\x14'. 임의의 유니 코드 문자로 파일 이름을 지원하려면 ASCII가 아닌 유니 코드 문자를 포함 할 수있는 PowerShell 출력을 Python 문자열로 디코딩을 참조하십시오.


16

이 질문은 실제로 subprocess출력에 대해 묻기 때문에 인코딩 키워드 (Python 3.6 이상)를 Popen허용 하므로 더 직접적인 접근 방식이 있습니다 .

>>> from subprocess import Popen, PIPE
>>> text = Popen(['ls', '-l'], stdout=PIPE, encoding='utf-8').communicate()[0]
>>> type(text)
str
>>> print(text)
total 0
-rw-r--r-- 1 wim badger 0 May 31 12:45 some_file.txt

다른 사용자의 일반적인 대답은 바이트를 텍스트 로 디코딩 하는 것입니다.

>>> b'abcde'.decode()
'abcde'

인수없이 sys.getdefaultencoding()사용됩니다. 데이터가 아닌 sys.getdefaultencoding()경우 decode호출 에서 명시 적으로 인코딩을 지정해야합니다 .

>>> b'caf\xe9'.decode('cp1250')
'café'

3
또는 Python 3.7을 text=True사용하면 주어진 인코딩 (설정된 경우) 또는 시스템 기본값을 사용하여 stdin, stdout 및 stderr을 디코딩하도록 전달할 수 있습니다 . Popen(['ls', '-l'], stdout=PIPE, text=True).
보리스

인코딩을 ls사용한 디코딩 출력 utf-8이 실패 할 수 있습니다 ( 2016의 내 답변의 예 참조 ).
jfs

1
@Boris : encoding매개 변수가 제공 되면 매개 text변수가 무시됩니다.
jfs

11

시도하여 다음을 얻어야하는 경우 decode():

AttributeError : 'str'객체에 'decode'속성이 없습니다.

캐스트에서 인코딩 유형을 직접 지정할 수도 있습니다.

>>> my_byte_str
b'Hello World'

>>> str(my_byte_str, 'utf-8')
'Hello World'

6

Windows 시스템의 데이터로 작업 할 때 ( \r\n줄 끝이있는) 내 대답은

String = Bytes.decode("utf-8").replace("\r\n", "\n")

왜? 여러 줄의 Input.txt를 사용하여 시도하십시오.

Bytes = open("Input.txt", "rb").read()
String = Bytes.decode("utf-8")
open("Output.txt", "w").write(String)

모든 줄 끝이 두 배로 (to \r\r\n) 빈 줄이 추가됩니다. 파이썬의 텍스트 읽기 함수는 일반적으로 줄 끝을 정규화하여 문자열이 만 사용하도록합니다 \n. Windows 시스템에서 이진 데이터를 수신하면 Python은 그렇게 할 기회가 없습니다. 그러므로,

Bytes = open("Input.txt", "rb").read()
String = Bytes.decode("utf-8").replace("\r\n", "\n")
open("Output.txt", "w").write(String)

원본 파일을 복제합니다.


나는 .replace("\r\n", "\n")너무 오랫동안 추가를 찾고있었습니다 . HTML을 올바르게 렌더링하려면 대답입니다.
mhlavacka

5

리스트를 정리하는 기능을 만들었습니다

def cleanLists(self, lista):
    lista = [x.strip() for x in lista]
    lista = [x.replace('\n', '') for x in lista]
    lista = [x.replace('\b', '') for x in lista]
    lista = [x.encode('utf8') for x in lista]
    lista = [x.decode('utf8') for x in lista]

    return lista

6
당신은 모든 체인 실제로 수 .strip, .replace, .encode하나 개의 목록 이해에 등 통화 만 반복 처리 목록을 통해 한 번 대신 반복하는의 위에 다섯 번.
Taylor Edmiston 2016 년

1
@TaylorEdmiston 어쩌면 할당을 절약 할 수 있지만 작업 수는 동일하게 유지됩니다.
JulienD

5

파이썬 3의 경우,이 훨씬 안전하고있다 파이썬 변환하는 방법 byte으로는 string:

def byte_to_str(bytes_or_str):
    if isinstance(bytes_or_str, bytes): # Check if it's in bytes
        print(bytes_or_str.decode('utf-8'))
    else:
        print("Object not of byte type")

byte_to_str(b'total 0\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2\n')

산출:

total 0
-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1
-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2

5
1) @bodangly가 말했듯이 유형 검사는 전혀 파이썬이 아닙니다. 2) 당신이 쓴 기능이 "라는 byte_to_str그것은 STR를 반환합니다 의미하는"하지만 그것은 단지 변환 된 값을 출력, 그리고 ) 실패하면 에러 메시지를 출력한다 (그러나 예외가 발생하지 않습니다. 이 방법은 또한 비유 의적이며 bytes.decode제공 한 솔루션을 난독 처리합니다 .
cosmicFluke

3

에서 SYS - 시스템 별 매개 변수 및 기능 :

표준 스트림에서 또는 표준 스트림으로 이진 데이터를 쓰거나 읽으려면 기본 이진 버퍼를 사용하십시오. 예를 들어, 바이트를 stdout에 쓰려면을 사용하십시오 sys.stdout.buffer.write(b'abc').


3
서브 프로세스에 대한 파이프는 이미 이진 버퍼입니다. 귀하의 답변은 결과 bytes값 에서 문자열 값을 얻는 방법을 설명하지 못합니다 .
Martijn Pieters

1
def toString(string):    
    try:
        return v.decode("utf-8")
    except ValueError:
        return string

b = b'97.080.500'
s = '97.080.500'
print(toString(b))
print(toString(s))

1
이 코드는 질문에 대답 할 수 있지만 문제를 해결하는 방법 및 / 또는 이유 에 대한 추가 컨텍스트 를 제공 하면 답변의 장기적인 가치가 향상됩니다. 지금 질문하는 사람뿐만 아니라 앞으로 독자들에게 질문에 대답하고 있음을 기억하십시오! 제발 편집 설명을 추가하고, 제한 및 가정이 적용 무엇의 표시를 제공하는 답변을. 이 답변이 왜 다른 사람들보다 더 적합한 지 언급하는 것도 아프지 않습니다.
Dev-iL

순서대로 설명하겠습니다.
피터 Mortensen

1

당신을 위해 특정의 경우 "쉘 명령을 실행하고 대신 바이트의 텍스트로 출력을 얻을", 파이썬 3.7에, 당신은 사용해야 subprocess.run및 전달 text=True(뿐만 아니라 capture_output=True출력을 캡처)

command_result = subprocess.run(["ls", "-l"], capture_output=True, text=True)
command_result.stdout  # is a `str` containing your program's stdout

text이전에 호출 universal_newlines되었고 Python 3.7에서 변경되었습니다. 3.7 이전의 Python 버전을 지원하려면 universal_newlines=True대신에 전달하십시오.text=True


0

바이트로 변환 된 문자열뿐만 아니라 모든 바이트를 변환하려면 다음을 수행하십시오.

with open("bytesfile", "rb") as infile:
    str = base64.b85encode(imageFile.read())

with open("bytesfile", "rb") as infile:
    str2 = json.dumps(list(infile.read()))

그러나 이것은 매우 효율적이지 않습니다. 2MB 사진을 9MB로 바꿉니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.