สตริงทับทิมที่ส่งกลับจริงสำหรับ #ascii_only หรือไม่? ชุดย่อยของสตริงที่คืนค่าจริงสำหรับ # is_utf8 ของ Activesupport

2020-02-15 ruby-on-rails ruby utf-8

ฉันมีข้อกำหนดที่จะตรวจสอบว่ามีอักขระจำนวนมากที่ไม่รู้จักการเข้ารหัสเป็น utf8 หรือไม่ ฉันใช้ ActiveSupport # is_utf8 อยู่หรือเปล่า อย่างไรก็ตามมันค่อนข้างช้าเพราะมันซ้ำสตริง ฉันสงสัยว่าฉันสามารถใส่ประโยคป้องกันโดยใช้ #ascii_only ได้ไหม การทดสอบของฉันแสดงว่าสิ่งนี้จะปรับปรุงประสิทธิภาพของ utf8 ของฉันได้อย่างไร วิธี.

วิธีการดั้งเดิม:

def utf8? character
  character.is_utf8?
end

วิธีที่เร็วกว่า:

def utf8? character
  return true if character.ascii_only?
  character.is_utf8?
end

มีอักขระที่จะส่งคืนค่าเท็จสำหรับ String # is_utf8 ของ ActiveSupport หรือไม่ ที่จะกลับมาจริงสำหรับ String # ascii_only ?

Answers

มีอักขระที่จะส่งคืนค่าเท็จสำหรับ String # is_utf8 ของ ActiveSupport หรือไม่ [และ] จริงสำหรับ String # ascii_only?

ตามคำจำกัดความของ UTF-8 ไม่มีตัวละครดังกล่าว

อักขระ 128 ตัวแรกของ Unicode .. ตรงกับตัวต่อตัวกับ ASCII ( https://en.m.wikipedia.org/wiki/UTF-8 )

แต่ฟังก์ชั่นเหล่านี้เคารพข้อกำหนดนี้หรือไม่? ใช่. :)

ascii_only? ผลตอบแทนจริง สำหรับตัวละคร 0..127 โดยไม่คำนึงถึงการเข้ารหัสที่เราระบุ

127.chr(Encoding::ASCII_8BIT).ascii_only? #=> true
128.chr(Encoding::ASCII_8BIT).ascii_only? #=> false
127.chr(Encoding::UTF_8).ascii_only? #=> true
128.chr(Encoding::UTF_8).ascii_only? #=> false

ทีนี้ลองดูที่ is_utf8? . ในการตอบคำถามเราต้องพิจารณาตัวอักษร 0..127 เท่านั้น

(0..127).any? { |i| !i.chr(Encoding::ASCII_8BIT).is_utf8? }
#=> false

ในช่วง 0..127 ไม่มีอักขระใดสำหรับ is_utf8? ส่งคืนค่าเท็จ

Related