HTML 인코딩 문제- "& nbsp;"대신 "Â"문자가 나타남


203

확실하지 않은 어떤 이유로 든 기존 앱이 잘못 작동하기 시작했습니다. ActivePDF에 의해 PDF 보고서로 변환되는 HTML을 많이 생성합니다.

프로세스는 다음과 같이 작동합니다.

  1. 교체 할 토큰이있는 DB에서 HTML 템플릿을 가져옵니다 (예 : "~ CompanyName ~", "~ CustomerName ~"등).
  2. 토큰을 실제 데이터로 교체
  3. 속성에 HTML 태그 속성 값의 서식을 지정하는 간단한 정규식 함수를 사용하여 HTML을 정리합니다 (ActivePDF의 렌더링 엔진은 속성 값 주위에 작은 따옴표 만 제외하고 따옴표 등을 보장합니다).
  4. PDF를 작성하는 웹 서비스로 HTML을 전송하십시오.

그 엉망인 어딘가에서 HTML 템플릿 (  들) 의 비 공백 공백은 ISO-8859-1로 인코딩되어 브라우저에서 문서를 볼 때 "Â"문자로 잘못 표시됩니다 (FireFox). 이러한 비 UTF8 문자에 대해 ActivePDF가 푸시합니다.

내 질문 : 문제의 원인을 알지 못하고 조사 할 시간이 없기 때문에 나쁜 문자를 다시 인코딩하거나 찾아서 바꿀 수있는 쉬운 방법이 있습니까? 나는 함께 던진이 작은 기능을 통해 그것을 보내려고했지만 모든 것을 gobbledegook로 바꾸어 아무것도 변경하지 않습니다.

Private Shared Function ConvertToUTF8(ByVal html As String) As String
    Dim isoEncoding As Encoding = Encoding.GetEncoding("iso-8859-1")
    Dim source As Byte() = isoEncoding.GetBytes(html)
    Return Encoding.UTF8.GetString(Encoding.Convert(isoEncoding, Encoding.UTF8, source))
End Function

어떤 아이디어?

편집하다:

좋은 해결책처럼 보이지는 않지만 지금은이 문제를 해결하고 있습니다.

Private Shared Function ReplaceNonASCIIChars(ByVal html As String) As String
    Return Regex.Replace(html, "[^\u0000-\u007F]", " ")
End Function

2
HTML에 문자 집합을 설명하는 메타 정보가 포함되어 있습니까?
Rowland Shaw

1
[이전 댓글 삭제됨] 짧은 답변 : 아니요.
Cᴏʀʏ

1
나를 위해 일했다 : utf8_decode ()
ursuleacv

답변:


340

그 엉망인 어딘가에서 HTML 템플릿 (들)의 비 공백 공백은 ISO-8859-1로 인코딩되어 "Â"문자로 잘못 표시됩니다.

ISO-8859-1이 아닌 UTF-8로 인코딩됩니다. 비 공백 공백 문자는 ISO-8859-1에서 바이트 0xA0입니다. UTF-8로 인코딩되면 0xC2,0xA0이되며 ISO (8859-1)로 보는 경우 (와 같이) 잘못 표시됩니다 " ". 여기에는 눈에 띄지 않는 후행 nbsp가 포함됩니다. 해당 바이트가 없으면 다른 것이 문서를 손상 시켰으며 무엇을 찾으려면 더 자세히 살펴 봐야합니다.

정규 표현식은 무엇입니까, 템플릿은 어떻게 작동합니까?  문자열이 (올바르게) U + 00A0 NON-BREAKING SPACE 문자로 바뀌면 어딘가에 적절한 HTML 파서가있는 것 같습니다 . 그렇다면 DOM에서 기본적으로 템플릿을 처리하고 ASCII 인코딩을 사용하여 ASCII가 아닌 문자를 문자 참조로 유지하도록 직렬화하도록 요청할 수 있습니다. 또한 HTML 자체에서 정규식 사후 처리를 중단해야 할 수도 있습니다.

어쨌든 지금은 문서에 다음 중 하나를 추가 <head>하여 브라우저에서 올바르게 보이는지 확인할 수 있습니다.

  • HTML4의 경우 : <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  • HTML5의 경우 : <meta charset="utf-8">

그렇게 한 경우 나머지 문제는 ActivePDF의 결함입니다.


20
<meta charset="utf-8">아직 권장 하지 않습니다. http-equiv버전은 HTML5 여전히 유효하며 더 나은 지원됩니다.
bobince 2019

8
사용할 응답 : <meta charset = 'utf-8'> vs <meta http-equiv = 'Content-Type' 은 짧은 버전이 잘 지원된다는 상태입니다.
Richard Ayotte 2012


모든 최신 브라우저 에서 작동 합니다. 모든 레거시 및 틈새 (예 : 모바일) 브라우저 또는 모든 스파이더에서 작동하지는 않습니다.
bobince 2019

3
"어딘가에"LOL! 좋은 오픈! 좋은 대답입니다! +1
저항 디자인

24

어느 누구도 나와 같은 문제가 있고 문자 집합이 이미 올바른 경우 간단히 다음을 수행하십시오.

  1. .html 파일 안에 모든 코드를 복사하십시오.
  2. 메모장 (또는 기본 텍스트 편집기)을 열고 코드를 붙여 넣습니다.
  3. "파일-> 다른 이름으로 저장"으로 이동
  4. 파일 이름 "example.html"을 입력하십시오 ( "파일 형식 : 모든 파일 ( . )"선택)
  5. 인코딩을 UTF-8로 선택
  6. 저장을 누르면 이전 .html 파일을 삭제할 수 있으며 인코딩이 수정되어야합니다

2
이것은 나를 위해 그것을했다. 이제는 숭고한 UTF-8 with BOM대신에 이라고 말합니다 UTF-8. 숭고한 텍스트에서이 문제를 확인하려면, 당신은 필요 show_encoding로 설정 true설정 - 사용자.
J86

»대신에, amd를 표시하는 문제가있었습니다.이 솔루션을 사용할 때 문제가 해결되었지만 PHP 경고가 있습니다. Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at D:\Program Files\wamp\wamp\www\projects\kerala\kerala_public_html\edit\business_details.php:1) in D:\Program Files\wamp\wamp\www\projects\kerala\kerala_public_html\user\include\fg_membersite.php on line 152
SCC

이 솔루션은 저에게 효과적이었습니다. notepad ++에서 일하고 있었고, 기본 ms notepad에서 UTF-8로 저장했을 때 notepad ++에서 새 파일을 연 후 인코딩이 UTF-8-BOM으로 설정되었습니다 (무엇을 의미하는지 모르겠습니다). 어쨌든, 그것은 저에게 문제가 된 것 같습니다.
BoltKey

감사합니다! 이 트릭을했다. 요청 / 응답에서 파일 (내 경우에는 ASPX)이 UTF-8로 인코딩되었음을 알 수 있습니다. 메모장 ++도 UTF-8로 인코딩되었습니다. 도대체 뭐죠? 그러나 당신은 해결책이 트릭을했습니다. 나를 위해, 그것은 페이지에서 올바르게 인코딩되지 않은 스페인어 문구였습니다. 스페인어로 UTF-8 BOM을 사용하지 않는 곳을 읽었지만 수정했습니다.
user3621633

13

문제 : POST 요청에서 일부 문자열로 '£' 를 CRM 시스템에 보내는 문제에 직면 했지만 CRM에서 GET 호출을 할 때 일부 문자열 내용으로 '£' 를 반환했습니다 . 우리가 분석 한 것은 '£''Â £' 로 변환되었다는 것 입니다.

분석 : 우리가 연구를 한 후에 발견 한 결함은 POST 호출에서 HttpWebRequest ContentType을 "text / xml" 로 설정하고 GET Call에서는 "text / xml; charset : utf-8"이라는 것 입니다.

솔루션 : 솔루션 의 일부로 POST 요청에 charset : utf-8 을 포함 시켰으며 작동합니다.


0

필자의 경우이 코드 (캐럿 포함)는 코드 생성을 위해 자체 도구를 사용하여 Visual Studio에서 생성 된 코드에서 발생했습니다. 해결하기 쉬웠다 :

문서에서 단일 공백 ​​()을 선택하십시오. 다른 단일 공간과 다르게 보이는 많은 단일 공간을 볼 수 있어야하며 선택되지 않습니다. 이 다른 단일 공백을 선택하십시오-이들은 브라우저에서 원하지 않는 문자를 담당합니다. 단일 공백으로 찾기 및 바꾸기 ()로 이동하십시오. 끝난.

추신 : 커서를 하나에 놓거나 VS2017 +에서 커서를 선택하면 유사한 문자를 모두 볼 수 있습니다. 다른 IDE가 비슷한 기능을 가질 수 있기를 바랍니다.


-1

필자의 경우 페이지가 UTF-8로 올바르게 인코딩되었다하더라도 nbsp 대신 라틴 십자 기호가 표시되었습니다. 위의 어느 것도 문제를 해결하는 데 도움이되지 않았으며 모두 시도했습니다.

IE 용 브라우저 글꼴 변경 (브라우저 별 CSS 사용)이 도움이되면 Helvetica-Nue를 Arial로 변경하는 본문 글꼴로 사용하여 문제를 해결했습니다.


글꼴을 전환하는 데 도움이 된 이유는 글꼴 중 하나에 해당 문자가 포함되어 있지 않았기 때문입니다. 따라서 보았던 것은 빈 문자였습니다. 그러나 이것은 문제를 해결하지 못했습니다.
Oliver Hausler

-2

나는 같은 종류의 문제가 있었다. 분명히 PHP가 utf-8을 인식하지 못하기 때문입니다.

DreamWeaver에서 괜찮아 보이지만 '£'표시가 'Â £'로 계속 표시 될 때 처음으로 머리카락이 찢어졌습니다. 결국 나는 페이지를 직접 볼 경우 슬라이드 쇼와 함께 작동하지만 포함과 함께 사용하지 않을 때 색인 파일과 관련된 링크에 문제가 있었다는 것을 기억했습니다 (그러나 그것은 옆에 있습니다. 어쨌든 이것이 이것이 비슷한 문제이므로 문제가있는 페이지에 넣는 대신 index.php 파일에 넣으면됩니다.


-2

PHP가 utf-8을 인식하지 못하기 때문입니다.

여기에서 HTML의 모든 특수 문자를 확인할 수 있습니다

http://www.degraeve.com/reference/specialcharacters.php


1
이것은 PHP에 대한 질문이 아니라 VB.NET입니다.
Cᴏʀʏ

아니요, 그러나 이러한 문자를 사용하여 문제를 해결할 수 있습니다. 이것은 내 솔루션을 수정했습니다.
al123

-2

글쎄, 내 웹 사이트 에서도이 문제가 발생했으며 HTML 엔터 테이먼트 용 콘텐츠 fetler를 사용자 정의하기 만하면됩니다. 그 전에 더 많은 것을 삭제합니다. 그래서 페이지에 대한 html fiter 또는 구문 분석 기능을 변경하면 효과가 있습니다. 주로 CMS 대부분의 HTML 편집기로 인해 발생합니다. 데이터를 저장하는 방식 으로이 문제가 발생했습니다 (내 경우). 이것이 귀하의 경우에도 도움이되기를 바랍니다.

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