2009-09-21 8 views
10

Mamy stronę internetową, która wykorzystuje klasyczną ASP.Klasyczne zastępowanie tekstu ASP i kodowanie UTF-8

Część naszego procesu wydania zastępuje wartości w pliku i znaleźliśmy w nim błąd, w którym zapisze plik jako UTF-8.

To powoduje, że nasza aplikacja zaczyna wypluwać śmieci. Apostrofy zostają zwrócone jako niektóre zakodowane postacie.

Jeśli następnie usuniemy zestawienie komponentów, które mówi, że plik ten ma format UTF-8, wówczas tekst, który wcześniej był renderowany jako śmieci, jest teraz wyświetlany poprawnie.

Czy jest coś, co usługi IIS robi inaczej, gdy napotka plik UTF-8?

+0

Jeśli usunięcie UTF-8 BOM powoduje, że strona do renderowania poprawnie wtedy zawartość nie jest UTF-8 na pewno? – AnthonyWJones

Odpowiedz

6

UTF-8 nie stosuje LM; jest to irytująca nieprawidłowość w niektórych oprogramowaniach Microsoft, które je tam umieszczają. Musisz dowiedzieć się, jaki krok w procesie zwolnienia zawiera kodowanie UTF-8 w plikach i naprawić go - powinieneś to przerwać, nawet jeśli jest przy użyciu UTF-8, co naprawdę jest najlepsze w dzisiejszych czasach.

Ale wątpię, czy to IIS powoduje problem z wyświetlaniem. Bardziej prawdopodobne jest, że przeglądarka zgaduje zestaw znaków końcowej wyświetlanej strony, a kiedy widzi bajty, które wyglądają jak kodowane w UTF-8, domyśla się, że cała strona ma UTF-8. Powinieneś być w stanie zatrzymać to robi, że stwierdzając ostateczne charset przy użyciu nagłówka HTTP:

Content-Type: text/html;charset=iso-8859-1 

i/lub meta element HTML

<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" /> 

teraz (zakładając ISO-8859- 1 jest tak naprawdę zestawem znaków, w którym znajdują się twoje dane) powinien wyświetlać OK. Jeśli jednak na początku twój plik ma na początku zestawienie BOM zakodowane w UTF-8, zobaczysz go na swojej stronie jako "ï» ¿", czyli jak te bajty wyglądają w ISO-8859-1. Więc nadal musisz się pozbyć tego misBOM.

+0

Prawo to ma sens. To był rzeczywiście błąd w kodzie, który został napisany specjalnie do obsługi tego rodzaju problemu. Dzięki. –

+1

Muszę przyznać, że ta odpowiedź wprowadza mnie w zakłopotanie."UTF-8 nie używa LM-ów" czy mógłbyś wymienić? W jaki sposób jest to "nieporozumienie"? Nigdy nie natknąłem się na problem z wykorzystaniem plików UTF-8, które zawierają ten znak o zerowej szerokości, jakie problemy napotkaliście? – AnthonyWJones

+0

Narzędzie tekstowe oparte na bajtach (takie jak powłoki, programy ładujące pliki itp.) Natychmiast zapadnie, gdy pojawi się "ï» ¿"na początku pliku; jest wyraźnym celem, aby UTF-8 był kompatybilny z narzędziami, które nic nie wiedzą o Unicode, ale UTF-8 + BOM to psuje. Nawet niektóre narzędzia rozpoznające Unicode potkną się o niego, ponieważ oczekuje się, że LM będzie obecna i automatycznie usunięta przez proces dekodowania Unicode dla UTF-16. UTF-8 + BOM łamie aplikacje i nie ma uzasadnienia dla używania go w specyfikacjach Unicode; i nie ma nawet żadnej korzyści, ponieważ UTF-8 nie ma problemów z kolejnością bajtów. – bobince

13

Szukałem na tym samym numerze dokładnym wczoraj i natknąłem:

http://blog.inspired.no/utf-8-with-asp-71/

Ważna część z tej strony, w przypadku, gdy odchodzi ...

ASP KOD:

Response.ContentType = "text/html" 
Response.AddHeader "Content-Type", "text/html;charset=UTF-8" 
Response.CodePage = 65001 
Response.CharSet = "UTF-8" 

i następujący znacznik HTML META:

<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> 

Korzystaliśmy z metatagu i właściwości asp CharSet, ale strona nadal nie była wyświetlana poprawnie. Po dodaniu pozostałych trzech linii do pliku asp wszystko po prostu zadziałało.

Mam nadzieję, że to pomoże!

+1

Nie potrzebujesz zarówno metatagu, jak i 'Response.CharSet =" UTF-8 "' ponieważ oba służą temu samemu celowi, osobiście wolę używać 'Response.CharSet =" UTF-8 "' raczej niż jawnie ustawiając to jako metatag w [tag: HTML]. Również 'Response.AddHeader" Content-Type "," text/html; charset = UTF-8 "' to po prostu jawna forma pisania 'Response.ContentType =" text/html "' i 'Response.CharSet =" UTF- 8 "" co sugerujesz jest bezcelowe, trzymaj się 'Response.ContentType' i' Response.CharSet'. – Lankymart

+0

Bardzo hepfull @Werewolf thx u za wkład .. – Artemination

+0

Uratujesz mi życie :) – kyawagwin

2

Jeśli używasz dostępu db należy napisać

Session.CodePage=65001 
Set tabtable= Conn.Execute("SELECT * FROM table")