2009-06-23 13 views
5

Mam plik CSV zawierający oba znaki Unicode ASCII &. powiedz "ÅÔÉA". Nie mam pewności co do formatu kodowania tego pliku, ale gdy go otworzę w Notatniku, pokaże się "ANSI" jako jego standard kodowania.Problem z kodowaniem w Javie

Pobieranie tej zawartości CSV w formacie zakodowanym w formacie UTF-8.

fr = new InputStreamReader (nowy FileInputStream (fileName), "UTF-8");

, ale gdy przechowuje się go w DB znaki specjalne, z wyjątkiem "A", nie są przechowywane prawidłowo. postacie się zakodowane

Chciałbym, aby wszystkie znaki były poprawnie przechowywane. Dowolny pomysł?

+0

Sprawdź plik za pomocą edytora szesnastkowego/wywrotki do zobacz, jakie bajty faktycznie reprezentują znaki spoza ASCII. – laalto

Odpowiedz

0

Czy w polu bazy danych obsługiwany jest kod Unicode? W MSSQL typ pola musi być nvarchar nad varchar. Jakiej bazy danych używasz?

6

"ANSI" w "Notatnik" oznacza dowolną stronę kodową używaną przez twoje okna. Wypróbuj ISO8859-1, działa w większości przypadków.

1

Sugeruję utworzenie małego programu, który odczytuje z pliku i wypisuje wartość Unicode odczytanych znaków, dzięki czemu można zapewnić, że podane wartości są poprawne. Dostępne są tabele kodów dostępne pod http://www.unicode.org/charts/ - prawdopodobnie można to zrobić za pomocą wykresów Basic Latin i Latin-1.

Domyślam się, że kodowanie jest rodzimym kodowaniem Windows. Wtedy możesz całkowicie uniknąć parametru "UTF-8" i pozwolić Java na użycie domyślnego kodowania platformy.

2

Miał ten problem. Potrzebne są dwie rzeczy: kolumny NVARCHAR2 i specyficzny wywołać metodę Oracle na PreparedStatement powiadomić wyrocznię o kodowaniu ciąg:

/** 
* Sets a statement parameter as NCHAR. Use before setting the field value. 
* @param pstmt the prepared statement 
* @param index the parameter index 
*/ 
public static void setNChar(PreparedStatement pstmt, int index) { 
    OraclePreparedStatement opstmt = (OraclePreparedStatement)pstmt; 
    opstmt.setFormOfUse(index, OraclePreparedStatement.FORM_NCHAR); 
} 

Jeśli używać zwykłego SQL ciąg ze znaków Unicode, który działa jak Oracle pobiera wszystkie polecenia SQL w UTF-8: sterownik automatycznie tłumaczy. Jednak w przypadku przygotowanego wyciągu z oświadczenia musisz wyraźnie powiedzieć to oracle.

Możesz także wypróbować PreparedStatement.setNString(), jeśli uruchomisz Javę 6 i masz sterownik ojdbc6. (W moim przypadku musieliśmy użyć Java 5 ze sterownikiem w wersji 4 - nie pytaj dlaczego)

(Uwaga: wiem, że jest to blokada dostawcy, ponieważ jesteś zmuszony używać klas konkretnych Oracle zamiast interfejsów jdbc)

2

Przede wszystkim musisz znać kodowanie pliku. Otwórz go za pomocą heksadecy. Ile bajtów zajmuje postać? Jeśli jest tylko jeden, plik nie jest w formacie UTF-8, ale jest bardziej prawdopodobny w niektórych ISO-8859 lub podobnym kodowaniu Windows (np. Win-1252). Jak wspomniano wcześniej, istnieje duże prawdopodobieństwo, że ISO-8859-1 jest właściwym kodowaniem. W przypadku języków Europy Wschodniej dobrym wyborem będzie ISO-8859-2.

Drugim zagadnieniem będzie zestaw znaków obsługiwany przez bazę danych dla kolumn znaków (ten parametr jest ustawiony podczas instalacji/tworzenia nowej instancji), ale ponieważ można wstawiać te znaki bezpośrednio, nie będzie to w tym przypadku problemem.

Jakiego sterownika jdbc używasz? Cienki sterownik nie powinien sprawiać żadnych problemów w tym zakresie, podczas gdy sterownik OCI może stworzyć dodatkową warstwę problemów, jeśli ustawienie NLS_LANG klienta nie jest zgodne z kodowaniem znaków bazy danych.

+0

Sądzę, że Oracle 10g pozwala na użycie UTF-8 lub UTF-16 dla formatu zapisu kolumny narodowego zestawu znaków. Domyślnie jest to UTF-16. – akarnokd

+0

kd304: można również określić kodowanie UTF-8 jako zestaw znaków dla kolumn CHAR (VARCHAR, VARCHAR2), więc każdy ciąg w bazie danych ma UTF8. –

0

Należy zakodować to w ISO 8859-1, a nie w UTF-8.

+1

Jeśli on/ona otrzymuje dane w UTF-8, dlaczego miałby transkodować go w mniejszym formacie? Oracle jest w stanie obsłużyć tekst Unicode. – akarnokd

0

Możesz ręcznie porównać zrzut heksadecymalny znaków do różnych kodowań (sample code), choć może to być pracochłonny proces. Alternatywnie możesz użyć biblioteki ICU, aby wypróbować, aby użyć tej metody, ale nie jest to metoda niezawodna.

Jak powstał plik CSV? Jeśli został utworzony przez aplikację Windows na angielskiej wersji systemu operacyjnego, kodowanie to prawdopodobnie będzie miało postać windows-1252 (canonical name "Cp1252" in Java); w polskim systemie może to być windows-1250. Najlepszym rozwiązaniem jest ustalenie, w jakim formacie został zapisany kod.

+0

Dobry pomysł. Możesz użyć funkcji DUMP() oracle, aby zobaczyć, jak łańcuch jest przechowywany w bajcie kolumny po bajcie i porównać go z sekwencją bajtów oryginalnego pliku. – akarnokd

0

Pierwszą rzeczą, którą należy zrobić, to System.out.println() ciągu po wczytaniu go z pliku. Jeśli jest uszkodzony w konsoli, Twój plik nie jest w rzeczywistości UTF-8, jeśli wygląda dobrze, masz problem ze sposobem zapisywania go w bazie danych :)

Powiązane problemy