Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.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 包含来自文件系统的UMLAUT的字符串的长度_Ruby_String_Utf 8_Diacritics - Fatal编程技术网

Ruby 包含来自文件系统的UMLAUT的字符串的长度

Ruby 包含来自文件系统的UMLAUT的字符串的长度,ruby,string,utf-8,diacritics,Ruby,String,Utf 8,Diacritics,更新重新表述了我的问题: 我有一个小脚本,它为给定文件夹中的每个目录创建摘要: def processDir(dir) title = "Project #{dir}" <<EOF #{title} #{'-' * title.length} ... EOF end 因此,我正在寻找一种方法来计算我的字符串的确切长度 更新::这真的很奇怪,这取决于我从哪里复制它,我在控制台中得到不同的结果 1.9.3-p448 :012 > "Propädeutikum".l

更新重新表述了我的问题:

我有一个小脚本,它为给定文件夹中的每个目录创建摘要:

def processDir(dir)
  title = "Project #{dir}"
<<EOF
#{title}
#{'-' * title.length}
...    


EOF
end
因此,我正在寻找一种方法来计算我的字符串的确切长度

更新::这真的很奇怪,这取决于我从哪里复制它,我在控制台中得到不同的结果

1.9.3-p448 :012 > "Propädeutikum".length
 => 13 
1.9.3-p448 :013 > "Propädeutikum".length
 => 14 

到目前为止,Ruby字符串只支持ASCII字符。因此,您可以使用gem-在使用非ascii字符的情况下执行此操作。看看这里

读这篇文章

是的,现在使用unicode gem。非ASCII码上的字符串操作 字符是即将发布的Ruby 2.2的主题之一

         matz.

到目前为止,Ruby字符串只支持ASCII字符。因此,您可以使用gem-在使用非ascii字符的情况下执行此操作。看看这里

读这篇文章

是的,现在使用unicode gem。非ASCII码上的字符串操作 字符是即将发布的Ruby 2.2的主题之一

         matz.

与Matt类似,但可能会稍微高效一些

"Propädeutikum".each_char.size
# => 13

t = Time.now
500000.times{
"Propädeutikum".each_char.size
}
puts Time.now - t
# => 0.364056992

t = Time.now
500000.times{
"Propädeutikum".chars.count
}
puts Time.now - t
# => 1.462392185

与Matt类似,但可能会稍微高效一些

"Propädeutikum".each_char.size
# => 13

t = Time.now
500000.times{
"Propädeutikum".each_char.size
}
puts Time.now - t
# => 0.364056992

t = Time.now
500000.times{
"Propädeutikum".chars.count
}
puts Time.now - t
# => 1.462392185

也许您在Unicode等价性和组合字符方面有问题

请参见下面的示例。两个文本看起来相似,但编码方式不同:

#encoding: utf-8
text = "Myl\u00E8ne.png" #"Mylène.png"
text2 = "Myle\u0300ne.png" #"Mylène.png"

puts text   #Mylène.png
puts text2  #Mylène.png

puts text.size   #10
puts text2.size  #11

puts text.chars.count #10
puts text2.chars.count #11
有关更多详细信息,请参阅

如果您将文本的代码点与text.codepoints.to_a进行比较,您可以检查它。 在我的例子中,我得到:

p text.codepoints.to_a   #[77, 121, 108, 232, 110, 101, 46, 112, 110, 103]
p text2.codepoints.to_a  #[77, 121, 108, 101, 768, 110, 101, 46, 112, 110, 103]

也许您在Unicode等价性和组合字符方面有问题

请参见下面的示例。两个文本看起来相似,但编码方式不同:

#encoding: utf-8
text = "Myl\u00E8ne.png" #"Mylène.png"
text2 = "Myle\u0300ne.png" #"Mylène.png"

puts text   #Mylène.png
puts text2  #Mylène.png

puts text.size   #10
puts text2.size  #11

puts text.chars.count #10
puts text2.chars.count #11
有关更多详细信息,请参阅

如果您将文本的代码点与text.codepoints.to_a进行比较,您可以检查它。 在我的例子中,我得到:

p text.codepoints.to_a   #[77, 121, 108, 232, 110, 101, 46, 112, 110, 103]
p text2.codepoints.to_a  #[77, 121, 108, 101, 768, 110, 101, 46, 112, 110, 103]

在unicode中,某些字符(如ä)可以用两种方式表示。它们可以是单个码点,例如在ä的情况下为U+00E4,或者它们可以由紧跟着a的“基本”字符形成,例如后面紧跟着U+0308组合分划。在后一种情况下,组合字符由两个代码点组成,Ruby的Stringlength方法只返回代码点的总数,因此可以为看起来相同的字符串的长度获取不同的值

s1=ä单码点 s2=一个“基本”字母 s3=一个\u0308基字母+组合字符 [s1、s2、s3]。每个do| 放置字母:{s} 放置字节:{s.Bytes} 放置代码点:{s.Codepoints} 放置长度:{s.Length} 放 终止 输出:

信:ä 字节:[195164] 代码点:[228] 长度:1 信:a 字节:[97] 代码点:[97] 长度:1 信:ả 字节:[97204136] 代码点:[97776] 长度:2 字节是字符的UTF-8编码。在UTF-8中,一些字符被编码为多个字节——这是与组合字符不同的问题

Ruby本身目前不太支持处理像这样的unicode问题,所以您需要使用外部库,例如。当谈论不同语言时,长度的概念可能变得非常不清楚,什么是“单个字符”。您可以使用display_width方法,这可能会给出您想要的拉丁语脚本。另一种可能性是使用,它确保所有字符都以相同的方式表示,或者全部分解为组合字符,或者全部使用单个字符可用:

需要“unicode\u utils” 组合=a\u0308 单个=ä nfc-标准化表单组合-如果可能,使用单个代码点 将UnicodeUtils.nfccombined.length=>1 将UnicodeUtils.nfcsingle.length=>1 nfd-标准化形式分解-始终使用组合字符 将UnicodeUtils.nfdcombined.length=>2 将UnicodeUtils.nfdsingle.length=>2
在unicode中,某些字符(如ä)可以用两种方式表示。它们可以是单个码点,例如在ä的情况下为U+00E4,或者它们可以由紧跟着a的“基本”字符形成,例如后面紧跟着U+0308组合分划。在后一种情况下,组合字符由两个代码点组成,Ruby的Stringlength方法只返回代码点的总数,因此可以为看起来相同的字符串的长度获取不同的值

s1=ä单码点 s2=一个“基本”字母 s3=一个\u0308基字母+组合字符 [s1、s2、s3]。每个do| 放置字母:{s} 放置字节:{s.Bytes} 放置代码点:{s.Codepoints} 放置长度:{s.Length} 放 终止 输出:

信:ä 字节:[195164] 代码点:[228] 长度:1 信:a 字节:[97] 代码点:[97] 长度:1 信:ả 字节:[97204136] 代码点:[97776] 长度:2 字节是字符的UTF-8编码。在UTF-8中,一些cha racter被编码为多个字节–这是与组合字符不同的问题

Ruby本身目前不太支持处理像这样的unicode问题,所以您需要使用外部库,例如。当谈论不同语言时,长度的概念可能变得非常不清楚,什么是“单个字符”。您可以使用display_width方法,这可能会给出您想要的拉丁语脚本。另一种可能性是使用,它确保所有字符都以相同的方式表示,或者全部分解为组合字符,或者全部使用单个字符可用:

需要“unicode\u utils” 组合=a\u0308 单个=ä nfc-标准化表单组合-如果可能,使用单个代码点 将UnicodeUtils.nfccombined.length=>1 将UnicodeUtils.nfcsingle.length=>1 nfd-标准化形式分解-始终使用组合字符 将UnicodeUtils.nfdcombined.length=>2 将UnicodeUtils.nfdsingle.length=>2
与Matt版本的问题相同。@贝西,这是你的问题,不是我们的问题。确定+1表示你的时间统计,尽管这在我的情况下不是问题,但知道它很有用。我从文件名中获取字符串,因此它可能与文件系统有关。当然,这是我的问题,因此我是要问这个问题的人:-与Matt版本的问题相同。@Besi这是你的问题,而不是我们的问题。确定+1时间统计数据,尽管这在我的情况下不是问题,但知道它很有用。我从文件名中获取字符串,因此它可能与文件系统有关。当然,这是我的问题,因此我是问这个问题的人:-我想你是对的。Unicode::widthstring现在确实解决了这个问题。我想你是对的。Unicode::widthstring现在确实解决了这个问题。@Besi它应该,等到2.2版,就像matz说的那样:-@ArupRakshit+1为您提供信息,我认为您应该参加SO选举:您为SO上的ruby标记做了很多工作,感谢您的支持efforts@Besi正如马茨所说,应该等到2.2-@ArupRakshit+1为您提供信息,我认为您应该参加SO选举:您为SO上的ruby标记做了很多工作,感谢您的努力。这非常有趣。实际上,在我的键盘上,我可以按¨键,然后按a键来得到这个。我不确定这是否会产生一个不同的字符,但它是同一个概念。@Besi你是对的,这是同一种想法,但与实际使用的字符不同。在我的机器上,我可以在Mac上按alt+u,然后按a来获取ä,但结果是单码点版本。@贝西,看看你编辑的问题,显示_的宽度或unicode gem的宽度可能就是你在本例中想要的。好的,这非常有趣。实际上,在我的键盘上,我可以按¨键,然后按a键来得到这个。我不确定这是否会产生一个不同的字符,但它是同一个概念。@Besi你是对的,这是同一种想法,但与实际使用的字符不同。在我的Mac电脑上,我可以按alt+u,然后按a以获取ä,但结果是单码点版本。@贝西,看看你编辑的问题,显示_宽度或unicode gem的宽度可能就是你在本例中所要的。