문제

나는 EM Dash가 포함 된 ASCII 파일입니다 (또는 — HTML에서). 16 진수는 0x97입니다. 하나의 응용 프로그램을 통해이 파일을 전달하면 UTF-8으로 도착하며 문자를 0xc297로 변환합니다. — HTML에서. 그러나이 파일을 다른 응용 프로그램을 통해 전달하면 문자를 0xe28094 또는 —.

이러한 응용 프로그램이 이러한 문자를 다르게 변환하게하는 원인은 무엇입니까? 코드 페이지 설정일까요?

도움이 되었습니까?

해결책

- 잘못되었습니다. 숫자 문자 참조를 사용하면 숫자는 유니 코드 코드 포인트를 나타냅니다. 256 미만의 숫자의 경우 ISO-8859-1의 CodePoint와 동일합니다. 8859-1에서 문자 151은 "C1 컨트롤 코드"중 하나이며 대시 나 다른 눈에 띄는 문자가 아닙니다.

문자 151은 Windows 코드 1252 (서유럽)의 대시이기 때문에 혼란이 발생합니다. 많은 사람들은 CP1252가 ISO-8859-1과 동일하다고 생각하지만 실제로는 그렇지 않습니다. C1 범위 (128 ~ 159)의 문자는 다릅니다.

첫 번째 응용 프로그램은 "ASCII"파일*을 ISO-8859-1로 읽는 것입니다. 그러나 실제로는 CP1252 일 것입니다. 그리고 인코딩이 무엇을 인코딩 해야하는지에 대한 앱을 실마리시키는 방법이 필요합니다.

(*: "ASCII"는 파일에 최고 비트 세트 문자가있는 경우 잘못된 이름입니다. 아마도 "ANSI"를 의미하는데, 이는 실제로 잘못된 이름이지만 Windows World에 붙어있는 "텍스트 인코딩"을 의미합니다. 현재 시스템-디폴트 코드 페이지에서”).

다른 팁

  • — Em Dash가 아닙니다, 귀하의 텍스트는 EM Dash에서 해당 값으로 잘못 전환되었습니다.
  • — EM Dash의 HTML 소수 단체입니다. 특히 EM 대시를 나타내는 유니 코드 코드 포인트 8212를 참조하고 있습니다.
  • EM 대시가 포함 된 경우 파일이 ASCII가 아닙니다. ASCII 숯은 10 진수 범위 0-127로만 인코딩하며 EM Dash는 ASCII 인코딩으로 표현할 수있는 문자가 아닙니다. EM 대시가 0x97 (151로 소수점)으로 저장 된 경우 ANSI 텍스트 파일 (일명 Windows CodePage 1252 (W-1252))가있을 수 있습니다.

첫 번째 앱 ...
데이터는 W-1252에서 인코딩 된 EM 대시로 시작되었습니다. W-1252에서 EM 대시는 10 진수 값 151 (166 진수의 0x97 또는 이진의 10010111)에 맵핑됩니다.

어느 시점에서 EM Dash는 귀하의 파일의 바이트가 ISO-8859-1 인코딩 된 텍스트라고 생각하는 코드로 처리되었습니다. 해당 코드가 0x97을 문자열/char it으로 해석했을 때 ISO-8859-1 인코딩에 따라 0x97을 문자에 매핑했습니다.. ISO-8859-1 0x97에서 숯 "보호 지역의 끝"에지도.

다음으로, 코드가 생각하는 문자열은 "가드 영역의 끝"컨트롤 숯이라고 생각합니다. UTF-8로 인코딩 된 "가드 영역의 끝"은 2 바이트 시퀀스입니다 : 0xc2 0x97.

두 번째 앱 ...
텍스트 파일은 W-1252로 올바르게 해석되었으므로 0x97은 EM Dash로 인식되며 UTF-8 : 0xe2 0x80 0x94에서 EM Dash로 올바르게 인코딩되었습니다.

이 행동에 영향을 미치는 것은 무엇입니까?
웹 앱을 다루고 있는지 또는 무엇을 처리하고 있는지 확실하지 않지만 개념은 그와 동일해야합니다. 사람들이 데이터를 양식에 입력하는 웹 앱에서 동일한 0x97-> 0xc297 시나리오를 가졌습니다. 웹 페이지의 숯이 ISO8859-1로 선언되었으며 W1252 Chars를 처리하는 브라우저의 가장 좋은 방법은 사용자 나 서버를 경고하지 않고 ISO 바이트와 같이 전송하는 것이 었습니다. 서버는 데이터가 ISO라고 생각하고 UTF-8로 변환하여 0xc297을 수신합니다.

기본적으로 앱이 텍스트를 터치 할 때마다 텍스트가 어떻게 인코딩되는지 알려 주거나 시스템 기본값으로 돌아갈 수 있습니다. 이런 일이 발생하면 데이터 손상 위험이 있습니다.

HTML4 사양에 따르면 캐릭터 엔티티 참조, emdash는 - (U+2014).

ASCII 파일은 ASCII 문자 세트가 0x00에서 0x7f 범위에 불과하기 때문에 문자 0x97을 포함 할 수 없습니다. 따라서 파일은 ASCII가 아니라 다른 단일 바이트 인코딩입니다. 예를 들어 Windows-1250 인코딩에는 0x97의 EM-Dash가 있습니다.

응용 프로그램이 파일을 작성하는 데 사용 된 것보다 다른 인코딩을 사용하여 텍스트 파일을 디코딩하면 0x7f 이상의 문자가 잘못됩니다.

유니 코드에서 EM-Dash에는 문자 코드 0x2014 또는 8212가 소수점이 있습니다.

유니 코드 문자 'em dash'(U+2014)

예를 들어 Windows-1250을 인코딩으로 사용하는 웹 페이지에서 코드 — em-dash로 렌더링됩니다.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>em-dash</title>
    <meta http-equiv="content-type" content="text/html; charset=windows-1250"/>
</head>
<body>
    <div>&#151;</div>
</body>
</html>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top