2016-08-31 45 views
9

Wywołuję połączenie z warstwy pośredniej węzła do zaplecza Java i przekazuję ciąg znaków jako parametr zapytania. Wszystko działa wspaniale, dopóki nie zostaną użyte znaki alfabetu angielskiego (np .: ř, ý). Kiedy Java odbiera te znaki rzuca:Egzekwowanie kodowania utf8 w wywołaniu z węzła do Java

parse exception: org.eclipse.jetty.util.Utf8Appendable$NotUtf8Exception: Not valid UTF8! 

toll działa perfekcyjnie:

GET http://localhost:8000/server/name?name=smith 

Wezwanie powiedzie się z powyższego błędu:

GET http://localhost:8000/server/name?name=sořovský 

Moje pytanie dotyczy gdzie do tej kwestii . Znalazłem koder utf8 this dla węzła i myślałem o kodowaniu moich łańcuchów jako utf8 przed wywołaniem mojej warstwy Java w przyszłości. Czy to właściwe podejście, czy też powinienem coś robić w Javie?

Uwaga, to co moi odpowiednie nagłówki żądania wyglądać następująco:

{ 
    ... 
    accept: 'application/json, text/plain, */*', 
    'accept-encoding': 'gzip, deflate, sdch', 
    'accept-language': 'en-US,en;q=0.8,el;q=0.6', 
    ... 
} 
+1

Jeśli strona Java podaje ten błąd, to najprawdopodobniej dane wejściowe najprawdopodobniej nie są prawidłowo zakodowane w UTF-8, więc musisz sprawdzić, dlaczego strona Węzła nie koduje go poprawnie. Bez większej ilości szczegółów (jak wygląda twój kod?) Bardzo trudno jest udzielić bardziej szczegółowej odpowiedzi. – Jesper

+0

@Jesper, dzięki! Dodałem szczegóły do ​​mojego pytania, pokazujące opcje moich żądań. – MattDionis

+2

Potrzebujesz więcej informacji na temat adresów URL i potencjalnych nagłówków żądań. Czy możesz przechwycić nagłówki żądań i dodać je do swojego pytania? –

Odpowiedz

1

Zapisz plik javascript na utf8.

var name = "sořovský", 
    param1 = encodeURIComponent(name); 

var url = "http://localhost:8000/server/name?name=" + param1; 

console.log(url); 
// http://localhost:8000/server/name?name=so%C5%99ovsk%C3%BD 

Można zobaczyć dziennik z GET http://localhost:8000/server/name?name=sořovský:

{ 
    "args": { 
    "name": "sořovský" 
    }, 
    "headers": { 
    "Accept": "application/json, text/plain, */*", 
    "Accept-encoding": "gzip, deflate, sdch", 
    "Accept-language": "en-US,en;q=0.8,el;q=0.6", 
    //... 
    }, 
    "url": "http://localhost:8000/server/name?name=sořovský" 
} 
1

GET obsługuje tylko char.set ASCII wysłać inne znaki musisz procent zakodować znaki specjalne.

+0

Tak więc wygląda na to, że moje opcje zmieniają 'GET' na' POST' lub kodują ciąg przed przekazaniem go jako parametru zapytania. – MattDionis

+0

Tak, to prawda. Kodowanie powinno być moim zdaniem pierwszym wyborem. –

0

Jest możliwe, że serwer nie faktycznie używać UTF-8 jako domyślnego kodowania (jak można by normalnie asume), ale zamiast tego używa ISO-8859-1.

Który, jak można się spodziewać, nie zostanie zdekodowany za pomocą utf-8 (będzie to oczywiste tylko w przypadku znaków spoza zestawu ASCII). Miałem bardzo podobny problem z serwerem JBoss.

Rozwiązanie dla mnie było, zamiast używać request.getParameter() (które automatycznie konwertuje parametr przy użyciu UTF-8) do wykorzystania zamiast:

String name = new String(request.getParameter("name").getBytes("iso-8859-1"),"utf-8"); 
0

wydawać się wysyłania UTF16 ciąg i traktując jako UTF-8. Wszystkie ciągi JavaScript mają format UTF16. Możliwe, że parametry są również wysyłane jako UTF16. Możesz spróbować wysłać parametry za pomocą kodera UTF16 po stronie Java, a następnie przekonwertować na kodowanie, które chcesz.

Upewnij się, że sprawdziłeś także endogenność swojej maszyny. Mam nadzieję, że to pomoże.

+0

Również łatwiej byłoby przekonwertować ciąg znaków z UTF16 -> UTF8 w Javie niż w JavaScript. Jestem pewien, że istnieje mnóstwo API. – dimitrirostavo