ruby-on-rails - 在 Active Record 回调中验证日语字符

标签 ruby-on-rails ruby validation rails-activerecord cjk

我有一个日文项目需要验证半角和全角日文字符,半角允许 14 个字符,全角允许 7 个字符。

有人知道如何实现吗?

现在在我的模型上

class Customer
   validates_length_of :name, :maximum => 14
end

不是一个好的选择

我目前使用的是 ror 2.3.5 全角和半角都可以使用

最佳答案

首先,全角(全角)和半角(半角)的概念只存在于日语中的两种字符:

  • 罗马字符(即拉丁文)
  • 片假名字符

韩语韩文有类似的概念,但日语平假名和汉字没有。

对于片假名,半角字符有自己的 Unicode 代码点,并且呈现为全角字符一半的大小,尽管它们在其他方面的形状相同。示例:

全角“ka”:カ
半角“ka”:ν

半角版本中不存在组合字符(即带有变音符号,如ga);它们必须编码为两个单独的字符:゙ + ゙,这可能是为什么在您的任务中允许半角字符数量增加两倍的原因。 (请注意,这些两个代码点的组合被视为组合字符,通常呈现为一个。)

对于罗马(拉丁)字符,通常的 ASCII 字符称为半角字符,但 Unicode 的日文代码范围(以及传统的日本特定字符集)为全角字符提供了单独的代码范围版本。示例:

全角:L
半角:L

非 ASCII 拉丁派生字符(例如德语变音符号)和重音版本均不存在全角版本。但是,它们确实存在于数字和一些标点符号中。

同样,平假名和汉字没有半角版本。

要检查字符是全角字符还是半角字符,请将代码点与相关代码范围进行比较。范围如下:

半角片假名:0xff610xff9f
全角片假名:0x30a00x30ff
半角罗马字:0x210x7e(这是 ASCII)
全角罗马字:0xff010xff60
平假名:0x30410x309f
汉字(即统一表意文字范围):0x4e000x9fcc

这是一个简单的 Ruby 程序,它对每个字符执行检查:

# -*- coding: utf-8 -*-

def is_halfwidth_katakana(c)
  return (c.ord >= 0xff61 and c.ord <= 0xff9f)
end

def is_fullwidth_katakana(c)
  return (c.ord >= 0x30a0 and c.ord <= 0x30ff)
end

def is_halfwidth_roman(c)
  return (c.ord >= 0x21 and c.ord <= 0x7e)
end

def is_fullwidth_roman(c)
  return (c.ord >= 0xff01 and c.ord <= 0xff60)
end

def is_hiragana(c)
  return (c.ord >= 0x3041 and c.ord <= 0x309f)
end

def is_kanji(c)
  return (c.ord >= 0x4e00 and c.ord <= 0x9fcc)
end

text = "Hello World、こんにちは、半角カタカナ、全角カタカナ、fullwidth 0-9\n"

text.split("").each do |c|
  if is_halfwidth_katakana(c)
    type = "halfwidth katakana"
  elsif is_fullwidth_katakana(c)
    type = "fullwidth katakana"
  elsif is_halfwidth_roman(c)
    type = "halfwidth roman"
  elsif is_fullwidth_roman(c)
    type = "fullwidth roman"
  elsif is_hiragana(c)
    type = "hiragana"
  elsif is_kanji(c)
    type = "kanji"
  end

  printf("%c (%x) %s\n",c,c.ord,type)
end

进一步说明

  1. 上面的代码范围是每种字符类型的官方 Unicode 范围(参见 Unicode Fullwidth formsUnicode Hiragana)。其中包括某些全角/半角版本的旧/传统形式的字符或特殊标点字符。如果您只需要 Web 表单中常用的字符(例如,供人们输入姓名),您可能需要稍微缩小范围。

  2. 建议:如果这是用于人们可以输入姓名的 Web 表单,您可能需要做的不仅仅是检查半角或全角。它在日本网站和注册表单上非常常见,尤其是。对于银行,要求人们以纯半角(通常用于拉丁语)或纯全角(通常用于片假名)输入他们的名字。不幸的是,这使得输入数据非常不方便。当启用日文输入法时,拉丁字符通常以全角形式出现,然后 Web 表单将拒绝该数据,因为它不是纯半角。与其拒绝它,不如自动将其转换为它需要的任何形式。您可以通过从一个代码范围转换到另一个代码范围(只需添加相关常量即可)轻松实现这一点,并让人们的生活更加轻松。

关于ruby-on-rails - 在 Active Record 回调中验证日语字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15631168/

相关文章:

ruby-on-rails - 从字符串中删除引号,以便我可以将其添加到 Controller 操作中

ruby-on-rails - ActiveRecord 作用域返回一个数组

ruby-on-rails - 如何防止 Rails 用户意外验证为错误的用户?

带有 session 的 Javascript 来显示或隐藏内容

Excel 数据验证 - 正则表达式?

php - 如何在用户上传文件时验证该文件是 LESS 文件

javascript - Ruby on Rails 键盘快捷键

ruby - MongoMapper:查找在指定日期创建的所有文档

ruby 与类方法、实例方法和类变量混合

ruby-on-rails - 将 Rails 2.3.5 应用程序升级到 3.0