2009-09-28 11 views
24

Mam ciąg znaków zawierający znak I Nie udało mi się go poprawnie zastąpić.Jak zamienić ï ¿½ w łańcuchu

String.replace ("�", "");

nie działa, czy ktoś wie, jak usunąć/zastąpić ï w łańcuchu?

+4

Co to jest kod (y) kodu Unicode dla tego, co chcesz zastąpić? –

+3

Zgodnie z odpowiedzią od Gunslinger47, postać, którą MrThys chce zastąpić, prawie na pewno jest " ", ponieważ ma ona sekwencję UTF-8 0xEF 0xBF 0xBD, która jest sekwencją podaną nam przez McDowella –

+6

Dla każdego, kto się potknął na tym, i nie rozumie, dlaczego znaki "½" są tworzone podczas przetwarzania, istnieje zapis (** disclaimer: ** napisałem to), który tłumaczy, dlaczego tak się dzieje, na [to pytanie StackOverflow] (http://stackoverflow.com/questions/6366912/reading-file-from-windows-and-linux-yields-different-results-character-encoding/6367675#6367675). –

Odpowiedz

30

To jest znak zastępczy Unicode, \ uFFFD. (info)

Coś jak to powinno działać:

String strImport = "For some reason my �double quotes� were lost."; 
strImport = strImport.replaceAll("\uFFFD", "\""); 
+5

w tym przypadku wiesz t to podwójne cytaty, ale technicznie te brakujące znaki mogą być kilkoma innymi znakami, prawda? –

+1

@ Elzo: Tak. Patrząc na mój ciąg, te dwie postacie były prawdopodobnie "i" na początku, ale mogły być dowolną liczbą innych rzeczy. – Gunslinger47

+0

Naprawiłem to również poprzez otwarcie db w textwrangler i robienie znalezienia i zamiany –

8

Prosi się o zastąpienie postaci " ", ale dla mnie, która przychodzi jako trzy znaki "'", "¿" i "½". To może być Twój problem ... Jeśli używasz Javy przed wersją Java 1.5, otrzymujesz tylko znaki UCS-2, to tylko pierwsze znaki UTF-8 o długości 65 000 znaków. Na podstawie innych komentarzy najbardziej prawdopodobne jest, że poszukiwana postać to " ", czyli postać zastępująca Unicode. Jest to postać, która jest "używana do zamiany przychodzącego znaku, którego wartość jest nieznana lub niereprezentowalna w Unicode".

Właściwie, patrząc na komentarz od Kathy, inną kwestią, którą możesz mieć, jest to, że javac nie interpretuje twojego pliku .java jako UTF-8, zakładając, że piszesz go w UTF-8. Spróbuj użyć:

javac -encoding UTF-8 xx.java 

Lub zmodyfikować kod źródłowy zrobić:

String.replaceAll("\uFFFD", ""); 
+0

� jest postrzegany jako 1 char – Thys

+0

Dla ciebie może być postrzegana jako jedna postać, reszta z nas nie ma tyle szczęścia ;-) Podaj nam kod, który próbujesz zastąpić. –

5

Jak mówili inni, to napisali 3 znaki zamiast jednego. Proponuję uruchomić ten mały fragment kodu, aby zobaczyć, co faktycznie w ciąg:

public static void dumpString(String text) 
{ 
    for (int i=0; i < text.length(); i++) 
    { 
     System.out.println("U+" + Integer.toString(text.charAt(i), 16) 
          + " " + text.charAt(i)); 
    } 
} 

Jeśli po wyniki, że to będzie łatwiej się zorientować, co się dzieje. (Nie zawracałem sobie głowy obijaniem sznurka - możemy to zrobić przez inspekcję ...)

0

Użyj unicode escape sequence. Po pierwsze musisz znaleźć kodowy dla znaku, który starają się zastąpić (powiedzmy to ABCD w hex):

str = str.replaceAll("\uABCD", ""); 
16

kwestie postaci takie jak ten są trudne do zdiagnozowania, ponieważ informacja jest łatwo utracone w wyniku błędnej interpretacji znaków przez błędów aplikacji, błędną, cut'n'paste itp

Jak (i ​​najwyraźniej inni) to widzę, wklejeniu trzy znaki:

codepoint glyph escaped windows-1252 info 
======================================================================= 
U+00ef  ï  \u00ef  ef,    LATIN_1_SUPPLEMENT, LOWERCASE_LETTER 
U+00bf  ¿  \u00bf  bf,    LATIN_1_SUPPLEMENT, OTHER_PUNCTUATION 
U+00bd  ½  \u00bd  bd,    LATIN_1_SUPPLEMENT, OTHER_NUMBER 

do identyfikacji znaków, należy pobrać i uruchom program z this page. Wklej swoją postać do pola tekstowego i wybierz tryb glifu; wklej raport do swojego pytania. Pomoże to zidentyfikować problematyczny charakter.

0

for detail

import java.io.UnsupportedEncodingException; 

/** 
* File: BOM.java 
* 
* check if the bom character is present in the given string print the string 
* after skipping the utf-8 bom characters print the string as utf-8 string on a 
* utf-8 console 
*/ 

public class BOM 
{ 
    private final static String BOM_STRING = "Hello World"; 
    private final static String ISO_ENCODING = "ISO-8859-1"; 
    private final static String UTF8_ENCODING = "UTF-8"; 
    private final static int UTF8_BOM_LENGTH = 3; 

    public static void main(String[] args) throws UnsupportedEncodingException { 
     final byte[] bytes = BOM_STRING.getBytes(ISO_ENCODING); 
     if (isUTF8(bytes)) { 
      printSkippedBomString(bytes); 
      printUTF8String(bytes); 
     } 
    } 

    private static void printSkippedBomString(final byte[] bytes) throws UnsupportedEncodingException { 
     int length = bytes.length - UTF8_BOM_LENGTH; 
     byte[] barray = new byte[length]; 
     System.arraycopy(bytes, UTF8_BOM_LENGTH, barray, 0, barray.length); 
     System.out.println(new String(barray, ISO_ENCODING)); 
    } 

    private static void printUTF8String(final byte[] bytes) throws UnsupportedEncodingException { 
     System.out.println(new String(bytes, UTF8_ENCODING)); 
    } 

    private static boolean isUTF8(byte[] bytes) { 
     if ((bytes[0] & 0xFF) == 0xEF && 
      (bytes[1] & 0xFF) == 0xBB && 
      (bytes[2] & 0xFF) == 0xBF) { 
      return true; 
     } 
     return false; 
    } 
} 
-1

Nie powyższa odpowiedź rozwiązać mój problem. Kiedy pobierasz xml, wstawia <xml do mojego xml.Po prostu

xml = parser.getXmlFromUrl(url); 

xml = xml.substring(3);// it remove first three character from string, 

teraz działa poprawnie.

0

zmienić kodowanie na UTF-8 podczas parsowania .To usunie znaki specjalne

0

wnikliwie kod URL i błąd Unicode. ten symbol przyszedł do mnie również w google tłumaczeniu w tekście armeńskim, a czasem połamanym birmańskim.