Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 验证活动记录回调中的日语字符_Ruby On Rails_Ruby_Validation_Rails Activerecord_Cjk - Fatal编程技术网

Ruby on rails 验证活动记录回调中的日语字符

Ruby on rails 验证活动记录回调中的日语字符,ruby-on-rails,ruby,validation,rails-activerecord,cjk,Ruby On Rails,Ruby,Validation,Rails Activerecord,Cjk,我有一个日语项目,需要验证半幅和全幅日语字符,半幅允许14个字符,全幅允许7个字符 有谁知道如何实现这一点 现在在我的模型上 class Customer validates_length_of :name, :maximum => 14 end 这不是一个好的选择 我目前正在使用ror 2.3.5 全宽和半宽都可以使用首先,全宽的概念(全角) 和半宽度(半角) 日语中仅存在两种类型的字符: 罗马字符(即拉丁语) 片假名字符 韩语韩语也有类似的概念,但日语平假名和汉字都没有 对

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

有谁知道如何实现这一点

现在在我的模型上

class Customer
   validates_length_of :name, :maximum => 14
end
这不是一个好的选择

我目前正在使用ror 2.3.5
全宽和半宽都可以使用

首先,全宽的概念(全角) 和半宽度(半角) 日语中仅存在两种类型的字符:

  • 罗马字符(即拉丁语)
  • 片假名字符
韩语韩语也有类似的概念,但日语平假名和汉字都没有

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

全宽“ka”:カ
半宽“ka”:カ

组合字符(即带有变音符号,如ガ) 半宽度版本中不存在;它们必须编码为两个单独的字符:カ + ゙, 这可能就是为什么在您的任务中允许两倍于一半宽度的字符(请注意,这两个代码点的组合被视为组合字符,通常呈现为一个)

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

全宽:L
半幅:L

对于非ASCII拉丁派生字符(如德语umlauts),也不存在全宽版本。但是,对于数字和一些标点字符,也不存在全宽版本

平假名和汉字也没有半角版本

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

半幅片假名:
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、こんにちは、半角カタカナ、全角カタカナ、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
#-*-编码:utf-8-*-
def为半宽片假名(c)
return(c.ord>=0xff61和c.ord=0x30a0和c.ord=0x21和c.ord=0xff01和c.ord=0x3041和c.ord=0x4e00和c.ord以下代码可能会在最短的时间内将您推过这一行,以满足您迄今为止指定的确切要求。它使用(),这为确定日语字符串的内容提供了许多方便的方法

它在仅由半宽字符组成的
名称
中最多验证14个字符,否则在
名称
中最多验证7个字符(包括包含半宽和全宽字符组合的名称,即字符串中即使存在一个全宽字符,也会将整个字符串视为“全宽”)

作出的假设

  • 系统内的数据编码为UTF-8,并以UTF-8的形式存储在数据库中;任何进一步必要的重新编码(如将数据传递给遗留系统等)都在另一个模块中完成
  • 在将数据保存到数据库之前,不允许自动将半宽字符转换为全宽字符,即数据库中允许使用半宽字符,原因可能是遗留系统集成、正确保存实际用户输入(!)和/或半宽字符的美学价值(!)
  • 半角字符中的变音符号被视为它们自己的独立字符(即不解析カ 及゙ 被视为一个字符,用于确定字符串长度)
  • 您指定的名称字段只有一个,而不是现在非常常见的四个(用于姓氏、姓氏、给定名称、给定名称)

  • @garbagecollection很可能是的。即使这是一个关于字体宽度调整的答案。您是否可以用这些问题的答案编辑您的问题:1)您使用的是什么Ruby/Rails版本?2)数据库编码是什么?3)名称中是否有可能同时包含半宽和全宽字符在确定字符串长度时,是否将半角字符的长度视为一个单独的字符?5)虽然用户可能会输入半角字符,但您是否确实需要存储它们,或者在将它们保存到数据库之前是否可以将其转换为全宽?您可能会得到不同的结果
    的值コ".长度
    “速“.length
    等取决于您的Ruby版本,这就是为什么我会问(您是1.8.7还是1.9.x?).我询问数据库编码,因为即使Rails采用UTF-8,我在日本参与的项目也不采用UTF-8,甚至坚持使用Shift JIS/EUC-JP/ISO-2022-JP数据,这会带来有趣的编码问题。因为首先要求您实际处理半宽字符,我不会采用UTF-8。无论如何,如果我是你,我会问你的经理/客户他们对上面第3-5季度的感觉如何,并制定一个策略。在这种情况下,我假设半宽和全宽点半宽假名和全宽假名,日本片假名字母由于历史原因被分配给两个不同的代码。这不是字体,而是认为有两个a-z集(好吧,你有大写和小写,有点类似,但不完全相同)-
    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