2012-11-16 2 views
0

이것은 초보자 용 질문 일 수 있지만 여기에 있습니다. 큰 string (167572 바이트) ASCII 및 비 ASCII 문자가 있습니다. 문자열에 len()을 사용할 때 나는 length이 잘못되었습니다. len()은 0x0A 문자를 포함하지 않습니다.큰 문자열 및 len()

for x in test: 
    totalLen += 1 
for x in test: 
    if x == '\x0a': 
     totalLen += 1 
print totalLen 

len()에 어떤 문제가 : 나는 문자열의 실제 길이를 얻을 수있는 유일한 방법은이 코드인가? 아니면 잘못 사용하고 있습니까?

+0

실제 길이를 말하면 어떻게됩니까? 나는 당신이 167572 바이트를 모두 셉니다. :-) –

+2

코드에서' '\ x0a '' 문자를 두 번 계산합니다. – interjay

+0

문자열을 파일에 쓰고 16 진수 편집기에서 열면 문자 수를 계산합니다. –

답변

4

\r\n, 즉 ASCII 13 (줄 바꿈) 다음에 ASCII 13 (줄 바꿈)을 포함하거나 텍스트 파일에 쓰여진 문자열을 보면, 이것들을 추가합니까?

세부 정보를 많이 제공하지 않아 문자열의 데이터 출처가 명확하지 않으므로 구체적으로 설명하기가 어렵습니다.

6

인코딩 된 바이트 문자열을 유니 코드 텍스트와 혼동하고 있습니다. 예를 들어, UTF-8에서는 최대 3 바이트가 주어진 문자를 인코딩하는데 사용되고, 각 문자는 적어도 2 바이트 각각을 사용하여 인코딩됩니다.

파이썬 문자열은 일련의 바이트이며, 유니 코드를 얻으려면 적절한 코덱으로 문자열을 디코딩해야합니다. 텍스트는 UTF-8을 사용하여 인코딩 된 경우, 예를 들어, 당신이 그것을 해독 할 수 있습니다 반면에

test = test.decode('utf8') 

, 파일에 기록 된 데이터는 길이 10 수의 때문에 유니 코드 문자열 항상 인코딩 된 UTF-16 코덱을 사용하여 작성된 경우 파일에서 20 바이트를 차지합니다.

대개 '넓은 문자'와 혼동되지 않고 문자가 아닌 \n (ASCII 10) 문자가 올바르게 계산됩니다.

자신에게 부탁을하고 유니 코드 인코딩에 읽어 사항 : Python Unicode HOWTO