Jakie kodowanie sprawi, że ŁĘ Ö zadziała

12

Piszę małą aplikację na VB.net, która umożliwi mi łatwe utworzenie konta „Windows 7” za pomocą hasła, zamiast przechodzenia przez panel sterowania. Problem, który mam, polega na tym, że kiedy tworzę plik nietoperza w VB.net przy użyciu kodowania UTF-8, nie zapisuje on tak, jak powinien. Próbowałem już wszystkich kodowań, które mogę znaleźć, ale nie mogę go uruchomić.

Jeśli ktoś ma pomysł, dlaczego to dostaję, proszę dać mi znać. Z góry dziękuję!

kagstrom2100
źródło
spróbuj opublikować na stackoverflow.com i pokaż swój skrypt.
Toby Allen
1
@Toby Allen Cóż, tak naprawdę nie jest to pytanie programistyczne, ale pytanie o kodowanie tekstu, ten sam problem występuje, gdy tworzę plik .bat w „normalny” sposób.
kagstrom2100,

Odpowiedzi:

12

Edit: myliłem się;)
cmd.exebierze UTF-8, ale trzeba mieć pewność, aby zapisać go bezBOM na początku pliku.

Oto drugi test. Możesz użyć chcp 65001na początku pliku wsadowego.

wprowadź opis zdjęcia tutaj


Plik wsadowy nie może być typu UTF-8. To musi być ASCII. Cmd.exepo prostu nie akceptuje innego formatu. Zrobiłem mały test i możesz użyć swoich postaci, ale to wymaga trochę pracy.

Utwórz plik za test.batpomocą echo Å Ä Ö. Zapisz w formacie ANSI/ASCII. Otwieranie cmd.exei upewnić się, że cmd.exezastosowanie Lucida Console(do wyświetlania znaków Unicode).

Po wpisaniu pliku będą wyświetlane znaki jako stare znaki DOS. Można zobaczyć wykres tłumaczenie tutaj .

Po przejściu na „Windows Ansi” - strona kodowa (tzn. Łacińska Europa Zachodnia) ze chcp 1252znakami są wyświetlane poprawnie. To, czy zostaną przeniesione do odpowiednich narzędzi, zależy od tego narzędzia.

Ale dlaczego tworzysz do tego plik wsadowy? Nie możesz tego po prostu zakodować w VB.net?

cmd.exe


Edytuj 2 #:

W ten sposób można ustawić Lucida Consolew cmd.exe:

Lucida Console


BOMto 3 znaki na początku pliku UTF-8. ( \xEF\xBB\xBF).
W VB.NET byłoby utworzyć plik bezBOM tak:

Dim utf8WithoutBom As New System.Text.UTF8Encoding(False)
                                                  '^^^^^'
Using sink As New StreamWriter("Foobar.txt", False, utf8WithoutBom)
    sink.WriteLine("...")
End Using
Rik
źródło
Cześć i dzięki za odpowiedź. W mojej aplikacji vb.net próbuję utworzyć plik .bat za pomocą poleceń: użytkownik sieci „nazwa użytkownika” net grupa lokalna administrator „typ” / add Powodem, dla którego muszę użyć szwedzkiego słowa adminstratörer zamiast administratora jest to, że grupa lokalna wygrała nie bierz tłumaczenia na angielski jako grupy.
kagstrom2100
Pomyślałem, że przeglądanie pliku .bat było trochę dużo, gdy można to zrobić prosto z VB.net. Lubię tutaj . Wiele przykładów również w Google . Więc nie trzeba tworzyć .bata jako pośrednika. Dzięki tym przykładom możesz podać nazwę Unicode bezpośrednio do funkcji Windows. (Chyba, że ​​musisz z jakiegoś powodu uruchomić .bat w innym czasie niż aplikacja VB.net?)
Rik
Cóż, szukałem sposobu na zrobienie tego w VB.net w Google od wielu dni, chociaż nie znalazłem żadnego sposobu, aby to zrobić. Próbowałem już przykładu, który podlinkowałeś, i to nie działało. Jak upewnić się, że plik .bat nie używa BOM? Co to jest konsola Lucida? Jedyne informacje, jakie mogłem o tym znaleźć, to to, że jest to czcionka. Kiedy próbuję dokładnie tego, co zrobiłeś w drugim przykładzie / obrazku, otrzymuję to i.imgur.com/6sh20j0.jpg
kagstrom2100
Dodałem do mojej odpowiedzi, aby uwzględnić Lucida Consolei tworzenie plików bez BOM(Edytuj nr 2, na dole). Ale czy utworzenie tego użytkownika za net userpomocą wiersza polecenia? A co nie działa, jeśli utworzysz go za pośrednictwem VB.net? W tym celu potrzebowalibyśmy kodu przykładowego (lub osobnego pytania), ponieważ powinno to działać. (BTW połączyłeś mój obraz, a nie twój, jak sądzę, w swoim komentarzu)
Rik
2
@JohnLBevan Tak, masz rację. Najwyraźniej findnie radzi sobie zbyt dobrze z wejściem UTF-8. Ale możesz użyć findstr. W ten sposób:ping 127.0.0.1 -n 2 | findstr /C:" = "
Rik
2

Tym, co naprawiło to dla mnie, było zapisanie pliku jako UTF-8 bez BOM i użycie tego kodu

@echo off
chcp 65001
net user Linus /add
net localgroup Administratörer Test/add

To, czego wcześniej nie używałem, to wyłączenie @echo, więc naprawienie tego spowodowało użycie chcp 65001! Dziękuję też Rik za całą pomoc :)

kagstrom2100
źródło