2009-09-16 13 views
51

Piszę politykę TFS Checkin, która sprawdza, czy nasze pliki źródłowe zawierają nasz nagłówek pliku.Jak odczytać plik z kodowaniem ANSI zawierający znaki specjalne

Mój problem polega na tym, że nasz nagłówek pliku zawiera specjalny znak "©" i niestety niektóre z naszych plików źródłowych są zakodowane w ANSI. Więc jeśli przeczytałem te pliki w polityce, ciąg znaków wygląda jak "Copyright 2009".

string content = File.ReadAllText(pendingChange.LocalItem); 

Zmęczony, aby zmienić kodowanie ciąg, ale to nie pomaga. Jak mogę odczytać te pliki, że otrzymałem poprawny ciąg "Copyright © 2009"?

Dzięki za pomoc!

Pozdrowienia Eny

+0

czy nadal używasz nagłówków plików? Wydają się mało wartościowe ... –

+0

@Mitch: Co byś polecił zamiast nosić informacje o prawach autorskich w kodzie źródłowym? – AnthonyWJones

+2

To nie jest nasza decyzja, to polityka firmy. – Enyra

Odpowiedz

101

Zastosowanie Encoding.Default:

string content = File.ReadAllText(pendingChange.LocalItem, Encoding.Default); 

Trzeba mieć jednak świadomość, że czyta go przy użyciu kodowania domyślnego systemu - które nie mogą być takie same, jak kodowanie pliku. Nie ma jednego kodowania o nazwie ANSI, ale zwykle, kiedy ludzie mówią o "kodowaniu ANSI" mają na myśli kod systemu Windows lub cokolwiek, z czego korzysta ich skrzynka.

Twój kod będzie bardziej niezawodny, jeśli uda Ci się znaleźć używane kodowanie dokładne.

+0

Znajduję typ kodowania z preambułą kodowania, potem działa dobrze, dziękuję. – Enyra

5

Wydaje się rozsądne, jeśli będziesz mieć takie zasady, że chcesz, aby zespół uzgodnił standardowe kodowanie. Szczerze mówiąc, nie rozumiem, dlaczego jakikolwiek zespół użyłby kodowania innego niż "Unicode (UtF-8 z podpisem) - strona kodowa 65001" (z wyjątkiem może stron ASPX ze znaczącą statyczną zawartością niepochodzącą z Ameryki Łacińskiej, ale nawet wtedy mogę " t zobaczyć, jak używanie UTF-8 byłoby wielce trudne).

Zakładając, że nadal chcesz zezwalać na mieszane kodowania, musisz następnie ustalić, w którym kodowaniu zapisano plik, aby wiedzieć, które kodowanie przekazać do ReadAllText. Nie jest to łatwe do określenia z pliku, jednak użycie polecenia Encoding.Default może działać poprawnie. Ponieważ najprawdopodobniej masz tylko 2 kodowania, z którymi musisz sobie poradzić, VS (UTF-8 z podpisem) i wspólne kodowanie ANSI używane przez ciebie (prawdopodobnie Windows-1252).

Stąd stosując

string content = File.ReadAllText(pendingChange.LocalItem, Encoding.Default); 

zadziała. (Jak widzę Jon już opublikował). Dzieje się tak, ponieważ gdy BOM UTF-8 (co oznacza, że ​​VS oznacza termin "sygnatura") jest obecny na początku pliku, dostarczony parametr kodowania jest ignorowany, a mimo to jest używane UTF-8. W związku z tym, gdy plik jest zapisywany za pomocą UTF-8, otrzymujesz poprawne wyniki, a tam, gdzie używa się ANSI, najprawdopodobniej otrzymasz poprawne wyniki.

BTW jeśli przetwarzasz nagłówki plików, czy nie ułatwiłoby to ReadAllLines ?.

+0

Zastanawiam się również, dlaczego mamy jakieś pliki zakodowane ANSI ^^ – Enyra

+0

Twoje rozwiązanie tylko za pomocą kodowania.Domyślna wartość nie powiodłaby się jednak, gdyby dane wejściowe były plikami UTF8, ale nie miały LM (ponieważ nie wszystkie pliki UTF mają oczywiście LM-y). –

+1

Dzięki za wskazanie, że nawet jeśli używasz "Encoding.Default", jeśli zestaw BOM zostanie znaleziony na początku pliku, to powróci on do UTF8. To uratowało mój dzień. – carlos357