string.ToLower () และ string.ToLowerInvariant ()


164

อะไรคือความแตกต่างและเมื่อใช้อะไร สิ่งที่มีความเสี่ยงถ้าฉันมักจะใช้ToLower()และสิ่งที่เป็นความเสี่ยงถ้าฉันมักจะใช้ToLowerInvariant()?


4
บางทีคุณควรปรับมาตรฐานสตริงให้เป็นตัวพิมพ์ใหญ่แทน ดูmsdn.microsoft.com/en-us/library/bb386042.aspx
habakuk

คำตอบ:


149

ขึ้นอยู่กับวัฒนธรรมปัจจุบัน ToLower อาจสร้างตัวอักษรตัวพิมพ์เล็กเฉพาะวัฒนธรรมที่คุณไม่ได้คาดหวัง เช่นการผลิตınfoโดยไม่มีจุดบน i แทนinfoและทำให้ mucking การเปรียบเทียบสตริง ด้วยเหตุนี้ ToLowerInvariant จึงควรใช้กับข้อมูลที่ไม่ใช่ภาษาใด ๆ เมื่อคุณอาจมีการป้อนข้อมูลผู้ใช้ที่อาจอยู่ในภาษาพื้นเมือง / ชุดอักขระของพวกเขาโดยทั่วไปจะเป็นเพียงครั้งเดียวที่คุณใช้ ToLower

ดูคำถามนี้สำหรับตัวอย่างของปัญหานี้: C # - ToLower () บางครั้งก็ลบจุดออกจากตัวอักษร "I"


45

ฉันคิดว่าสิ่งนี้มีประโยชน์:

http://msdn.microsoft.com/en-us/library/system.string.tolowerinvariant.aspx

ปรับปรุง

หากแอปพลิเคชันของคุณขึ้นอยู่กับกรณีของสตริงที่เปลี่ยนแปลงในลักษณะที่คาดการณ์ได้ซึ่งไม่ได้รับผลกระทบจากวัฒนธรรมปัจจุบันให้ใช้วิธี ToLowerInvariant กระบวนการ ToLowerInvariant วิธีเทียบเท่ากับ ToLower (CultureInfo.InvariantCulture) แนะนำให้ใช้วิธีการเมื่อชุดของสตริงต้องปรากฏในลำดับที่คาดการณ์ได้ในส่วนควบคุมผู้ใช้

ด้วย

... ToLower คล้ายกันมากในสถานที่ส่วนใหญ่ของ ToLowerInvariant เอกสารระบุว่าวิธีการเหล่านี้จะเปลี่ยนพฤติกรรมกับวัฒนธรรมตุรกีเท่านั้น นอกจากนี้ในระบบ Windows ระบบไฟล์จะคำนึงถึงขนาดตัวพิมพ์ซึ่ง จำกัด การใช้ ...

http://www.dotnetperls.com/tolowerinvariant-toupperinvariant

HTH


@danyolgiax คุณช่วยอธิบายเพิ่มเติมได้ไหม? ไม่สามารถสรุปความสามารถใช้งานได้จากลิงก์ของ msdn ขอบคุณ
Prerak K

2
ใช่ ToLowerInvariant ไม่ทำงานในตุรกีตามที่คาดไว้ İกลายเป็นı
MonsterMMORPG

28

String.ToLower()ใช้วัฒนธรรมเริ่มต้นในขณะที่String.ToLowerInvariant()ใช้วัฒนธรรมที่ไม่เปลี่ยนแปลง ดังนั้นคุณจะได้เป็นหลักขอให้ความแตกต่างระหว่างวัฒนธรรมและคงเปรียบเทียบสตริงลำดับ


ไม่เขาไม่ใช่ "Ordinal" เป็นตัวเลือกที่สาม - วิธีที่แตกต่างกันเล็กน้อยในการ "ละเว้น" วัฒนธรรมปัจจุบัน ความแตกต่างนั้นไม่เกี่ยวข้องในการพูดคุยเรื่องToLowerสายพันธุ์ต่างๆ ลำดับสามัญกับค่าคงที่เพียงแค่เปลี่ยน "การเรียงลำดับ" ของสองสายไม่เปลี่ยนการเปรียบเทียบความเท่าเทียมกัน
ToolmakerSteve

28

TL; DR:

เมื่อทำงานร่วมกับ "เนื้อหา" (เช่นบทความที่โพสต์แสดงความคิดเห็นชื่อสถานที่อื่น ๆ ) ToLower()การใช้งาน เมื่อทำงานร่วมกับ "ตัวอักษร" (อาร์กิวเมนต์บรรทัดเช่นคำสั่งไวยากรณ์ที่กำหนดเองสตริงที่ควรจะเป็น enums ฯลฯ ) ToLowerInvariant()การใช้งาน

ตัวอย่าง:

= การใช้ToLowerInvariantอย่างไม่ถูกต้อง =

ในภาษาตุรกีDIŞแปลว่า "ภายนอก" และdişแปลว่า "ฟัน" ปลอกต่ำที่เหมาะสมของการมีDIŞ dışดังนั้นถ้าคุณใช้ToLowerInvariantผิดคุณอาจมีการพิมพ์ผิดในตุรกี

= การใช้ToLowerอย่างไม่ถูกต้อง =

ตอนนี้หลอกคุณกำลังเขียนตัวแยกวิเคราะห์ SQL บางแห่งคุณจะมีรหัสที่ดูเหมือนว่า:

if(operator.ToLower() == "like")
{
  // Handle an SQL LIKE operator
}

ไวยากรณ์ SQL จะไม่เปลี่ยนแปลงเมื่อคุณเปลี่ยนวัฒนธรรม ฝรั่งเศสไม่ได้เขียนแทนSÉLECTIONNEZ x DE books SELECT X FROM booksอย่างไรก็ตามเพื่อให้รหัสข้างต้นสามารถทำงานได้คนตุรกีจะต้องเขียนSELECT x FROM books WHERE Author LİKE '%Adams%'(จดบันทึกจุดเหนือเมืองหลวง i ซึ่งแทบจะเป็นไปไม่ได้ที่จะเห็น) สิ่งนี้น่าผิดหวังสำหรับผู้ใช้ชาวตุรกีของคุณ

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