Błąd w pliku strings.xml w systemie Android

114

W aplikacji zadeklarowałem długi ciąg znaków string.xml.

Tak zadeklarowano

<string name="terms">PLEASE READ THESE TERMS OF USE CAREFULLY  BY ACCESSING THIS .................</string>

Ale to daje następujący błąd:

error: Apostrophe not preceded by \ (in PLEASE READ THESE TERMS OF USE CAREFULLY
Subrat
źródło
1
błąd jest spowodowany zbyt dużą liczbą kropek w ciągu. `błąd: apostrof nie poprzedzony znakiem` to fikcyjna wiadomość, problem jest w kropkach. Jak pamiętam, po więcej niż trzech kropkach można uzyskać błąd.
Dudeist

Odpowiedzi:

293

opublikuj swój pełny ciąg. Chociaż sądzę, że w twoim ciągu znajduje się znak apostrofu ('). zamień go na (\ '), a to rozwiąże problem. na przykład,

//strings.xml
<string name="terms">
Hey Mr. Android, are you stuck?  Here, I\'ll clear a path for you.  
</string>

Odniesienie:

http://www.mrexcel.com/forum/showthread.php?t=195353

https://code.google.com/archive/p/replicaisland/issues/48

Priyank
źródło
30
Dlaczego nikt nie mówi o tym idiotycznym wymogu, abyśmy unikali każdego apostrofu w danych łańcuchowych? Nawet w sekcjach CDATA!
Phil Kulak
2
@PhilKulak heh, na przykład francuski jest szalony. Poszukamy i zamienimy ftw.
Warpzit
4
@PhilKulak W systemie Android strings.xml możesz zawrzeć cały ciąg w cudzysłowie innego typu, np. <string name="good_example">"This'll work"</string> Reference: developer.android.com/guide/topics/resources/ ...
situee
Może to powodować problem, gdy masz dużo ciągów i używasz zamień wszystko. Zobacz moją odpowiedź.
Dan Bray
26

Rozwiązanie

Apostrofy w pliku strings.xml powinny być zapisane jako

\'


Przykład

W moim przypadku wystąpił błąd z tym ciągiem w moim pliku strings.xml i naprawiłem go.

<item>Most arguments can be ended with three words, "I don\'t care".</item>

Tutaj widzisz, że moja aplikacja kompiluje się poprawnie z tym kodem.

wprowadź opis obrazu tutaj

Oto rzeczywisty ciąg znaków w mojej aplikacji.

wprowadź opis obrazu tutaj

JGallardo
źródło
1
Głupi ja, ponieważ używałem XML, używałem 'i to też jest błąd.
Chris Westin
12

Musisz umieścić \ przed apostrofem. W ten sposób \ ', sprawdź również, czy edytujesz strings.xml, a nie values.xml (Android Studio kieruje do tego pliku, gdy wyświetla błąd). Ponieważ jeśli edytujesz values.xml i spróbujesz ponownie skompilować, błąd będzie się powtarzał. Przydarzyło mi się to ostatnio.

Walmac
źródło
1
Ha ha! Mnie też się to przydarzyło. Właśnie z tego powodu apostrof pojawiał się ponownie. Doprowadzało mnie do szału.
DrMcCleod
10

https://developer.android.com/guide/topics/resources/string-resource.html#FormattingAndStyling

Unikanie apostrofów i cytatów

Jeśli masz apostrof lub cudzysłów w swoim ciągu, musisz albo uciec przed nim, albo ująć cały ciąg w inny typ otaczającego cudzysłowu. Na przykład, oto kilka użądleń, które działają i nie działają:

<string name="good_example">"This'll work"</string>
<string name="good_example_2">This\'ll also work</string>
<string name="bad_example">This doesn't work</string>
<string name="bad_example_2">XML encodings don&apos;t work</string>
situee
źródło
6

Użyj tego wyrażenia regularnego (?<!\\)'do wyszukiwania apostrofu bez znaku zmiany znaczenia. Znajduje apostrof, który nie jest poprzedzony ukośnikiem.

Elad Finish
źródło
4

Używam hebrajskiego (język RTL) w strings.xml. Ręcznie przeszukałem string.xml pod kątem tego znaku: ', a następnie dodałem znak ucieczki \ infront tego (teraz wygląda na \') i nadal otrzymuję ten sam błąd!

Szukałem ponownie znaku 'i zamieniłem znak' na \ '(pisanie ang), ponieważ pokazuje on od prawej do lewej, wygląda tak' \ w strings.xml !!

Problem rozwiązany.

Li3ro
źródło
@akauppi, Ten komentarz jest bardziej dla programistów języków RTL, ponieważ napotykamy edytory, które nie radzą sobie zbyt dobrze z RTL, wyświetlając znaki w złej kolejności na ekranie. wpisywanie długich hebrajskich sentencji w xml może powodować bałagan
Li3ro
Ach, od prawej do lewej. Teraz wszystko nabiera sensu. Dzięki.
akauppi
3
Rozwiązaliśmy dla hebrajskich apostrofów, uciekając po obu stronach: \ '\
radley
2

Możesz użyć ekwiwalentu Unicode zarówno apostrofu, jak i innych znaków, które nie są obsługiwane w ciągu xml. Odpowiednikiem apostrofu jest „\ u0027”.

Punkt fotonowy
źródło
1

1. dla błędu: apostrof bez znaku zmiany znaczenia w ciągu

odkryłem, że narzędzie AAPT2 wskazuje czasami na zły wiersz w XML. Więc powinieneś poprawić cały plik strings.xml

W Android Studio w przypadku plików problemowych:

Edytuj-> znajdź-> zamień

Następnie wpisz w pierwszym polu \ '(lub \ &,>, \ <, \ ")
w drugim miejscu' (lub &,>, <,"),
a następnie zamień je w razie potrzeby. (Lub „zamień wszystko” w przypadku znaku „ )
Następnie w pierwszym polu ponownie umieść '(lub &,>, <, "),
a w drugim napisz \'
i zamień je w razie potrzeby. (Lub" zamień wszystko "w przypadku ')

2. dla innych problematycznych symboli,
których używam do komentowania każdej następnej połowy części + przebudowy, aż nie znajdę złego znaku.

Np. Słowo ucieczki „\ update” nieoczekiwanie usuwa taki błąd :)

CodeToLife
źródło
1

Najlepsza odpowiedź na to, że po prostu ucieczka z 'z \'działa, ale nie podoba mi się to rozwiązanie, ponieważ przy użyciu zamień wszystko 'na \'to działa tylko raz. Za drugim razem zostaniesz z\\' .

W związku z tym, należy: \u0027.

Dan Bray
źródło