เกิดข้อผิดพลาดในไฟล์ strings.xml ใน Android


114

ฉันได้ประกาศสตริงที่ยาวในstring.xmlแอปพลิเคชัน

ประกาศเช่นนี้

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

แต่สิ่งนี้ทำให้เกิดข้อผิดพลาดต่อไปนี้:

error: Apostrophe not preceded by \ (in PLEASE READ THESE TERMS OF USE CAREFULLY

1
ข้อผิดพลาดคือเนื่องจากมีจุดในสตริงมากเกินไป `error: Apostrophe ไม่ได้นำหน้าด้วย 'เป็นข้อความจำลองปัญหาอยู่ในจุด อย่างที่ฉันจำได้หลังจากมากกว่าสามจุดคุณจะได้รับข้อผิดพลาด
Dudeist

คำตอบ:


293

โพสต์สตริงที่สมบูรณ์ของคุณ แม้ว่าฉันเดาว่ามีเครื่องหมายอะพอสทรอฟี (') ในสตริงของคุณ แทนที่ด้วย (\ ') และจะแก้ไขปัญหาได้ ตัวอย่างเช่น,

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

Ref:

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

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


30
เหตุใดจึงไม่มีใครพูดถึงข้อกำหนดที่งี่เง่านี้ที่เราหลีกเลี่ยงเครื่องหมายวรรคตอนเดียวในข้อมูลสตริง แม้แต่ในส่วน CDATA!
Phil Kulak

2
@PhilKulak เดี๋ยวก่อนมันค่อนข้างบ้ากับฝรั่งเศสเช่น เราจะค้นหาและแทนที่ ftw
Warpzit

4
@PhilKulak ใน Android strings.xml คุณสามารถใส่สตริงทั้งหมดไว้ในเครื่องหมายคำพูดประเภทอื่น ๆ เช่น<string name="good_example">"This'll work"</string> Reference: developer.android.com/guide/topics/resources/…
situee

สิ่งนี้อาจทำให้เกิดปัญหาเมื่อคุณมีสตริงจำนวนมากและใช้การแทนที่ทั้งหมด ดูคำตอบของฉัน
Dan Bray

26

สารละลาย

Apostrophes ในstrings.xmlควรเขียนเป็น

\'


ตัวอย่าง

ในกรณีของฉันฉันมีข้อผิดพลาดกับสตริงนี้ในstrings.xmlของฉันและฉันได้แก้ไขแล้ว

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

ที่นี่คุณจะเห็นว่าแอปของฉันสร้างอย่างถูกต้องด้วยรหัสนั้น

ใส่คำอธิบายภาพที่นี่

นี่คือสตริงจริงในแอปของฉัน

ใส่คำอธิบายภาพที่นี่


1
โง่ฉันตั้งแต่ฉันใช้ XML ฉันใช้ & apos; และนั่นก็เป็นข้อผิดพลาดเช่นกัน
Chris Westin

12

คุณต้องใส่ \ ก่อนเครื่องหมายวรรคตอน เช่นนี้ \ 'ให้ตรวจสอบด้วยว่าคุณกำลังแก้ไข strings.xml และไม่ใช่ values.xml (สตูดิโอ android นำคุณไปยังไฟล์นี้เมื่อแสดงข้อผิดพลาด) เนื่องจากถ้าคุณแก้ไข values.xml และพยายามคอมไพล์อีกครั้งข้อผิดพลาดยังคงอยู่ สิ่งนี้เกิดขึ้นกับฉันเมื่อไม่นานมานี้


1
ฮ่าฮ่า! ที่เพิ่งเกิดขึ้นกับฉันด้วย เครื่องหมายวรรคตอนยังคงโผล่ขึ้นมาด้วยเหตุผลนั้น กำลังทำให้ฉันบ้า
DrMcCleod

10

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

การหลีกเลี่ยงเครื่องหมายวรรคตอนและเครื่องหมายคำพูด

หากคุณมีเครื่องหมายวรรคตอนหรืออัญประกาศในสตริงของคุณคุณต้องเว้นวรรคหรือใส่ทั้งสตริงในเครื่องหมายคำพูดประเภทอื่น ตัวอย่างเช่นต่อไปนี้เป็นสิ่งที่ทำและไม่ได้ผล:

<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>

6

ใช้นิพจน์ทั่วไปนี้(?<!\\)'เพื่อค้นหาเครื่องหมายอะพอสทรอฟีที่ไม่ใช้ Escape พบเครื่องหมายวรรคตอนที่ไม่นำหน้าด้วยแบ็กสแลช


4

ฉันใช้ภาษาฮีบรู (ภาษา RTL) ใน strings.xml ฉันได้ค้นหา string.xml ด้วยตนเองสำหรับ char นี้: 'กว่าที่ฉันจะเพิ่ม Escape char \ infront ของมัน (ตอนนี้ดูเหมือนว่า \') และยังคงได้รับข้อผิดพลาดเดียวกัน!

ฉันค้นหา char 'อีกครั้งและฉันแทนที่ char' ด้วย \ '(การเขียนภาษาอังกฤษ) เนื่องจากมันแสดงขวาไปซ้ายดูเหมือนว่า' \ ใน strings.xml !!

แก้ไขปัญหา.


@akauppi ความคิดเห็นนี้เป็นข้อมูลเพิ่มเติมสำหรับนักพัฒนาภาษา RTL เนื่องจากเราพบบรรณาธิการที่ไม่สามารถจัดการ RTL ได้ดีนักโดยการแสดงอักขระผิดลำดับบนหน้าจอ การพิมพ์
ประโยคภาษาฮีบรูแบบ

อ่าขวาไปซ้าย ตอนนี้ทุกอย่างสมเหตุสมผลแล้ว ขอบคุณ
akauppi

3
เราแก้ไขสำหรับเครื่องหมายวรรคตอนภาษาฮีบรูโดยการหนีทั้งสองด้าน: \ '\
radley

2

คุณอาจสามารถใช้ยูนิโคดที่เทียบเท่าได้ทั้งเครื่องหมายอะพอสทรอฟีและอักขระอื่น ๆ ซึ่งไม่รองรับในสตริง xml ค่าเทียบเท่าของ Apostrophe คือ "\ u0027"


1

1.สำหรับข้อผิดพลาด: เครื่องหมายวรรคตอนที่ไม่ใช้ Escape ในสตริง

สิ่งที่ฉันพบคือเครื่องมือ AAPT2 ชี้ไปที่แถวผิดใน xml บางครั้ง ดังนั้นคุณควรแก้ไขไฟล์ strings.xml ทั้งหมด

ใน Android Studio ในการใช้ไฟล์ที่มีปัญหา:

Edit-> find-> แทนที่

จากนั้นเขียนในช่องแรก \ '(หรือ \ &,>, \ <, \ ")
ในการใส่ที่สอง' (หรือ &,>, <,")
จากนั้นแทนที่แต่ละช่องหากจำเป็น (หรือ "Replace all" ในกรณีที่เป็น " )
จากนั้นในช่องแรกให้ใส่ '(หรือ &,>, <, ")
อีกครั้งและในวินาทีเขียน \'
จากนั้นแทนที่แต่ละรายการหากจำเป็น (หรือ" แทนที่ทั้งหมด "ในกรณีที่มี")

2. สำหรับสัญลักษณ์ที่มีปัญหาอื่น ๆ
ฉันใช้เพื่อแสดงความคิดเห็นในแต่ละครึ่งส่วนถัดไป + สร้างใหม่จนกว่าฉันจะไม่พบเครื่องหมายที่ผิด

เช่นคำที่หลีกเลี่ยง "\ update" ทำให้เกิดข้อผิดพลาดดังกล่าวโดยไม่คาดคิด :)


1

คำตอบที่ดีที่สุดของการหลีกหนี'ด้วย\'ผลงาน แต่ฉันไม่ชอบวิธีแก้ปัญหาเพราะเมื่อใช้การแทนที่ทั้งหมดด้วย'ถึง\'จะใช้งานได้เพียงครั้งเดียว \\'ครั้งที่สองคุณจะถูกทิ้งให้อยู่กับ

ดังนั้นให้ใช้: \u0027.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.