Rails: จะลดขนาดสตริงที่ไม่ใช่ภาษาอังกฤษได้อย่างไร

ฉันจะลดขนาดสตริงที่ไม่ใช่ภาษาอังกฤษใน Ruby on Rails 3 ได้อย่างไร

str = "Привет"    # Russian 
puts str[0].ord   # => 1055
str.downcase!
puts str[0].ord   # => 1055 (Should be 1087)

ฉันต้องการให้ทำงานใน Ruby 1.8.7 และ Ruby 1.9.2


person Misha Moroshko    schedule 11.09.2011    source แหล่งที่มา
comment
คุณหมายถึงภาษากรีกหรือภาษาที่ไม่ใช่ภาษาอังกฤษใช่ไหม   -  person Cydonia7    schedule 11.09.2011
comment
ขณะนี้ฉันสนใจภาษารัสเซีย แต่อาจต้องการใช้ภาษาอื่นในอนาคต ดังนั้นฉันจึงกำลังมองหาวิธีแก้ปัญหาทั่วไป   -  person Misha Moroshko    schedule 11.09.2011


คำตอบ (5)


ทำไมไม่ใช้อัญมณี unicode_utils อัญมณีนี้จะไม่บังคับให้ downcase ทำงาน อย่างไรก็ตาม คุณสามารถใช้:

UnicodeUtils.downcase('Привет') #=> 'привет'
person Developer    schedule 09.03.2014

หากคุณต้องการใช้มันง่ายเช่นนี้:

> "Привет".downcase
=> "привет"

คุณต้องใส่ไฟล์โฟลเดอร์ Initializers string.rb

require 'unicode'

class String
  def downcase
    Unicode::downcase(self)
  end
  def downcase!
    self.replace downcase
  end
  def upcase
    Unicode::upcase(self)
  end
  def upcase!
    self.replace upcase
  end
  def capitalize
    Unicode::capitalize(self)
  end
  def capitalize!
    self.replace capitalize
  end
end
person Dima Melnik    schedule 10.12.2016

เนื่องจาก Ruby 2.4 มี การแมปเคส Unicode แบบเต็ม. ที่มา: https://stackoverflow.com/a/38016153/888294 ดูเอกสาร Ruby 2.4.0 สำหรับรายละเอียด: https://ruby-doc.org/core-2.4.0/String.html#method-i-downcase

person mmichaa    schedule 18.09.2017

วิธีแก้ปัญหาที่ดีและง่ายใน Rails คือการเพิ่ม string.rb ลงในโฟลเดอร์ Initializers จากนั้นในไฟล์นี้คุณสามารถแทนที่ String โดยใช้ mb_chars ซึ่งตอนนี้รองรับการเน้นเสียงและตัวอักษรแบบ downcase เช่น ñ

class String
  def downcase
    self.mb_chars.downcase.to_s
  end

  def capitalize
    self.mb_chars.capitalize.to_s
  end

  def upcase
    self.mb_chars.upcase.to_s
  end

  def titleize
    self.mb_chars.titleize.to_s
  end
end
person Jose Miguel Richard    schedule 08.07.2019

person    schedule
comment
หากไม่มีราง คุณจะต้องมี require 'active_support/core_ext' เพิ่มเติมเพื่อหลีกเลี่ยงข้อผิดพลาด วิธีการที่ไม่ได้กำหนด - person knut; 26.07.2012
comment
ยอดเยี่ยมมากว่าทำไมพวกเขาไม่แก้ไขใน Ruby 2.0 :( - person Egor Malkevich; 22.08.2013
comment
mb_chars ยังใช้ได้กับ capitalize และ upcase ทางออกที่ดี! เรายังสามารถโทร 'Привет'.mb_chars.downcase.wrapped_string - person Stepan Zakharov; 07.06.2016
comment
ในที่สุดมันก็ทำงานได้ตามที่คาดไว้ใน Ruby 2.4: "Привет".downcase #=> "привет" - person michau; 01.09.2016