val*_*ecx 6 ruby validation ruby-on-rails cjk rails-activerecord
我有一个需要验证半宽和全宽日文字符的日文项目,半宽度允许14个字符,全宽度允许7个字符.
有没有人知道如何实现它?
现在我的模特
class Customer
validates_length_of :name, :maximum => 14
end
Run Code Online (Sandbox Code Playgroud)
不是一个好选择
我目前正在使用ror 2.3.5可以使用全宽和半宽
jog*_*pan 10
首先,全角(全角)和半角(半角)的概念仅存在于日语中的两种类型的字符:
韩语韩语也存在类似的概念,但日语平假名和汉字不存在.
对于片假名,半角字符有自己的Unicode代码点,并且它们的大小是全角字符的一半,尽管它们的形状相同.例:
全宽"ka":カ
半宽"ka ":カ
在半宽版本中不存在组合字符(即像ガ那样的变音符号); 它们必须被编码为两个单独的字符:カ+゙,这可能是你的任务中允许两倍宽度的两倍字符的原因.(请注意,这两个代码点的组合被视为组合字符,通常呈现为一个.)
对于罗马(拉丁)字符,通常的ASCII字符称为半宽,但日语代码范围的Unicode(以及传统的日本特定字符集)为全宽版本提供单独的代码范围.例:
全宽:L
半宽:L
对于非ASCII拉丁语派生字符(例如德语变音符号),也不存在重音版本的全宽版本.但是,它们存在数字和一些标点字符.
同样,平假名和汉字没有半宽版本.
要检查字符是全角还是半宽字符,请将代码点与相关代码范围进行比较.范围如下:
半
宽片假名:0xff61通过0xff9f
全宽片假名:0x30a0通过0x30ff
半宽罗马:0x21通过0x7e(这是ASCII)
全宽罗马:0xff01通过0xff60
平假名:0x3041通过0x309f
汉字(即统一表意符号范围):0x4e00通过0x9fcc
这是一个简单的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?????????????????????????????? ???\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
Run Code Online (Sandbox Code Playgroud)
进一步说明
上面的代码范围是每种字符类型的官方Unicode范围(请参阅Unicode全宽格式和Unicode平假名).这些包括旧/传统形式或特殊标点字符的某些全宽/半宽版本的字符.如果您只需要Web表单中常用的字符(例如,人们输入其名称),您可能希望稍微缩小范围.
建议:如果这是针对人们可以输入姓名的网络表单,您可能需要做的不仅仅是检查半宽或全宽.它在日本的网站和注册表格上非常普遍,尤其是 与银行一起要求人们以纯半宽(通常为拉丁语)或纯全宽(通常为片假名)输入其名称.不幸的是,这使得输入数据非常不方便.启用日语输入法时,拉丁字符通常以全宽版本出现,然后Web表单将拒绝数据,因为它不是纯半宽.它应该自动将其转换为所需的任何形式,而不是拒绝它.您可以通过从一个代码范围转换到另一个代码范围(只需添加相关常量)轻松实现这一点,并使人们的生活更加轻松.
以下代码可能会让您超越线路,以满足您在最短时间内指定的确切要求.它使用Moji gem(日文文档),它提供了许多方便的方法来确定日语字符串的内容.
它证实在最多14个字符name的是仅由半角字符,和最多7个字符为name小号否则(包括含有的半波和全角字符的组合的名称,即甚至一个全的存在字符串中的宽度字符将使整个字符串被视为"全宽").
class Customer
validates_length_of :name, :maximum => 14,
:if => Proc.new { |customer| half_width?(customer.name) }
validates_length_of :name, :maximum => 7
:unless => Proc.new { |customer| half_width?(customer.name) }
def half_width?(string)
Moji.type?(string, Moji::HAN_KATA)
end
end
Run Code Online (Sandbox Code Playgroud)
做出的假设:
| 归档时间: |
|
| 查看次数: |
2513 次 |
| 最近记录: |