2010-04-09 10 views
5

Chcę wiedzieć, jak zamienić ciąg w Javie.Zamień znaki specjalne w ciągu w java

E.g.

String a = "adf�sdf"; 

Jak wymienić znaki specjalne i jak je unikać?

+2

Witamy w SO, zahi r! Skąd czerpiesz struny? Losowi użytkownicy? Usługa internetowa? Czy próbujesz zastąpić coś tym ciągiem lub użyć tego ciągu, aby zastąpić coś innego? – Pops

Odpowiedz

0

Możesz użyć sekwencji unikodowych Unicode (takich jak \u201c [otwarcie kręcone cytat]), aby "unikać" znaków, które nie mogą być bezpośrednio używane w kodowaniu źródłowym (domyślnie kodowanie domyślne dla twojej platformy, ale można to zmienić za pomocą parametru -encoding na javac).

+0

Kodowanie pliku źródłowego jest domyślnym kodowaniem domyślnym platformy, tzn. Zwykle nie jest to kodowanie UTF-8. –

+0

@Michael: Dzięki, naprawione. Nie wymyśliłem tego, zastanawiam się, z jakim językiem/środowiskiem faktycznie się wiąże? ;-) A może to było prawdą w 1996 r. Czy coś takiego ... –

+0

Wątpię w to, ponieważ UTF-8 nie został określony przed 1993 r., A Java zamiast tego miała zalecenie używania native2ascii przed dystrybucją kodu źródłowego. Domyślam się jednak, że UTF-8 jest domyślny w niektórych nowszych systemach. –

14

można pozbyć się wszystkich znaków poza printable ASCII range wykorzystaniem String#replaceAll() zastępując wzór [^\\x20-\\x7e] z pustym ciągiem:

a = a.replaceAll("[^\\x20-\\x7e]", ""); 

Ale to właściwie nie nie rozwiązuje swoją rzeczywistą problem. To więcej obejścia. Z podanych informacji trudno paznokci w dół przyczynę tego problemu, ale czytając jeden z tych artykułów musi pomóc dużo:

+0

Hmm, wydaje się, że istnieje błąd oznaczania (link 2 nie jest poprawnie przetwarzany), ale nie mogę go zlokalizować/naprawić? – BalusC

+1

@BalusC: Zdarza mi się cały czas (ponieważ bardzo często łączę się z dokumentami Java6), chcesz zastąpić spację końcem "% 20". –

+0

@ T.J. tak, to było to, dzięki :) BTW: Firefox zwykle wymyka się z nich przed wklejeniem, ale nie działo się to poprawnie z jakiegoś dziwnego powodu. Ponownie utworzyłem łącze i problem zniknął. – BalusC

2

Zakładając, że chcesz usuń wszystkie znaki specjalne, możesz użyć klasy znaków \p{Cntrl} Następnie wystarczy użyć następującego kodu:

stringWithSpecialCharcters.replaceAll("\\p{Cntrl}", replacement); 
+0

Działa to, jeśli założymy, że "znaki specjalne" oznaczają znaki sterujące ASCII. Z mojego doświadczenia wynika zazwyczaj, że jest to interpunkcja, ale w tym przypadku nikt się nie domyśla. –