문제

좋아, 내 문제는 내가 DB에서 라틴 -1로 저장된 문자열 ' 222 222 223 225'가 있다는 것입니다. Django에서 얻은 것은 (인쇄하여) 다음과 같은 문자열입니다. 이제 문자열을이 작업을 수행하는 함수로 전달해야합니다.

strdecryptedPassword + chr(ord(c) - 3 - intCounter - 30)

이 오류가 발생합니다.

chr () arg는 범위에 있지 않음 (256)

문자열을 먼저 라틴 -1로 인코딩하려고하면이 오류가 발생합니다.

'Latin-1'Codec은 위치 0-3에서 문자를 인코딩 할 수 없습니다.

나는 캐릭터 인코딩이 어떻게 작동하는지에 대한 무리를 읽었으며, 그것을 얻지 못하기 때문에 내가 놓친 것이 있습니다!

도움이 되었습니까?

해결책

첫 번째 오류 'chr () arg가 범위가 아닌 (256)'는 아마도 chr가 음수를 섭취 할 수 없기 때문에 값을 저지했음을 의미 할 것입니다. InputCounter + 33이 실제 문자 표현보다 더 많을 때 암호화 알고리즘이 무엇을 해야하는지 모르겠습니다.이 경우 수행해야 할 작업을 확인해야합니다.

두 번째 오류에 대해. 데이터를 적절히 표현하기 위해 일반 문자열 객체를 사용하지 않고 ()을 decode해야합니다 (). encode ()는 유니 코드 객체 (U '로 시작하는 사람들)를 가져 와서 출력 또는 파일에 기록 할 일반 문자열을 생성합니다. decode ()는 문자열 객체를 가져 와서 해당 코드 포인트가있는 유니 코드 객체를 생성합니다. 이것은 문자열 객체에서 생성 될 때 유니 코드 () 호출로 수행되며 대신 a.decode ( 'latin-1')를 호출 할 수도 있습니다.

>>> a = '\222\222\223\225'
>>> u = unicode(a,'latin-1')
>>> u
u'\x92\x92\x93\x95'
>>> print u.encode('utf-8')
ÂÂÂÂ
>>> print u.encode('utf-16')
ÿþ
>>> print u.encode('latin-1')

>>> for c in u:
...   print chr(ord(c) - 3 - 0 -30)
...
q
q
r
t
>>> for c in u:
...   print chr(ord(c) - 3 -200 -30)
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ValueError: chr() arg not in range(256)

다른 팁

Vinko가 언급 한 것처럼 Latin-1 또는 ISO 8859-1에는 인용문에 대한 인쇄용 문자가 없습니다. 8859-1에 대한 나의 노트에 따르면, "C1 컨트롤 (0x80-0x9f)은 ISO/IEC 6429 : 1992에서 나온 것입니다. 80, 81 또는 99의 이름을 정의하지 않습니다. 코드 포인트 이름은 vinko와 같이 다음과 같습니다.

\222 = 0x92 => PRIVATE USE TWO
\223 = 0x93 => SET TRANSMIT STATE
\225 = 0x95 => MESSAGE WAITING

이들의 올바른 UTF-8 인코딩은 (유니 코드, 이진, 16 진) :

U+0092 = %11000010 %10010010 = 0xC2 0x92
U+0093 = %11000010 %10010011 = 0xC2 0x93
U+0095 = %11000010 %10010101 = 0xC2 0x95

Circumflex가있는 라틴어 작은 문자 A는 ISO 8859-1 코드 0xe2이므로 유니 코드 U+00E2입니다. UTF-8에서는 이는 %11000011 %10100010 또는 0xc3 0xa2입니다.

센트 부호는 ISO 8859-1 코드 0xA2이므로 유니 코드 U+00A2입니다. UTF-8에서는 이는 %11000011 %10000010 또는 0xc3 0x82입니다.

따라서, 당신이보고있는 다른 무엇이든, 당신은 ISO 8859-1의 UTF-8 인코딩을 보지 않는 것 같습니다. 다른 모든 것만으로도 당신은 8을 볼 수있는 5 바이트를보고 있습니다.

추가: 답의 이전 부분은 'UTF-8 인코딩'주장을 다루지 만 나머지 질문을 무시합니다.

Now I need to pass the string into a function that does this operation:

    strdecryptedPassword + chr(ord(c) - 3 - intCounter - 30)

I get this error: chr() arg not in range(256).  If I try to encode the
string as Latin-1 first I get this error: 'latin-1' codec can't encode
characters in position 0-3: ordinal not in range(256).

당신은 실제로 우리에게 Intcounter가 어떻게 정의되는지 보여주지 않지만, 문자마다 부드럽게 증가하면 조만간 또는 나중에 'ord(c) - 3 - intCounter - 30'부정적 일 것입니다 (그리고 그건 그렇고, 상수를 결합하고 사용하지 마십시오.'ord(c) - intCounter - 33'?), 어느 시점에서, chr() 불평 할 가능성이 높습니다. 값이 음수 인 경우 256을 추가하거나 모듈러스 작업을 사용하여 0에서 255 사이의 양수 값을 갖도록하십시오. chr(). 우리는 intcounter가 얼마나 증가하는지 알 수 없기 때문에 0에서 255 사이의 순환인지 또는 단조로 증가하는지 알 수 없습니다. 후자의 경우 : 다음과 같은 표현이 필요합니다.

chr(mod(ord(c) - mod(intCounter, 255) + 479, 255))

여기서 256-33 = 223, 물론 479 = 256 + 223 chr() 모든 입력 문자 C와 intcounter의 값에 대해 긍정적이고 범위 0..255입니다. mod() 기능은 결코 부정적인 주장을 얻지 못하며 방법에 관계없이 작동합니다. mod() 인수가 부정적인 경우 동작).

글쎄, 그것은 요청에 의해 문자의 ord ()을 변경하는 끔찍한 체계로 암호화 되었기 때문에 데이터베이스에서 나오는 문자열이 암호화되어 해독됩니다. 위에서 제공 한 것은 작동하지 않는 것 같습니다. 데이터베이스에서는 라틴 -1이면 Django는 유니 코드로 변환하지만 유니 코드로 기능으로 전달할 수는 없지만 Latin-1로 인코딩하면 해당 오류가 표시됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top