2015-01-09 29 views
3

以下代码是我开始测试在我正在使用的“德州扑克Em”风格游戏中使用的内容。.match多字节字符问题?

我的问题是,当运行下面的代码时,涉及“♥”的放入函数返回一个“\ u”的位置。我感到肯定的是这个多字节字符引起了第二个问题的原因,我用字符串数组中的d替换了它,它返回了我期待的内容。见下图:

我的代码:

#! /usr/bin/env ruby 
# encoding: utf-8 

table_cards = ["|2♥|", "|8♥|", "|6d|", "|6♣|", "|Q♠|"] 

# Array of cards 

player_1_face_1 = "8" 
player_1_suit_1 = "♦" 

# Player 1's face and suit of first card he has 

player_1_face_2 = "6" 
player_1_suit_2 = "♥" 

# Player 1's face and suit of second card he has 

test_str_1 = /(\D8\D{2})/.match(table_cards.to_s) 

# EX: Searching for match between face values on (player 1's |8♦|) and the |8♥| on the table 

test_str_2 = /(\D6\D{2})/.match(table_cards.to_s) 

# EX: Searching for match between face values on (player 1's |6♥|) and the |6d| on the table 

puts "#{test_str_1}" 
puts "#{test_str_2}" 

提出到屏幕:

|8\u 

|6d| 

- 我的目标是拿到首先将返回:| 8♥|

我没有太多的寻找解决方案(甚至可能没有),但更多的是“尽可能简单”的解释是什么导致这个问题以及为什么。提前感谢任何有关此处发生的事情以及我如何解决目标的信息。

+0

操作系统?什么终端? – Anthony 2015-01-09 21:47:47

+2

将Unicode字符打印到屏幕上涉及的不仅仅是Ruby脚本的正确编码。它还要求您的控制台使用相同的代码集。如果这被设置为别的东西,那么这些事情就会发生。 Windows通常使用Win1252或ISO-8859-1,并且字符定义不匹配导致奇怪的输出。 – 2015-01-09 21:49:03

+1

这与'match'有关吗?你尝试过'puts“♥”'吗? – Stefan 2015-01-09 22:26:01

回答

1

你看到的“\ u”是Unicode字符串指示符。

例如,Unicode字符'HEAVY BLACK HEART'(U + 2764)可以打印为“\ u2764”。

友好的Unicode字符挂牌网站是http://unicode-table.com/en/sets/

您能够推出交互式红宝石在你的shell并打印心脏这样吗?

irb 
irb> puts "\u2764" 
❤ 

当我在我的Ruby运行你的代码,我得到的答案你期待:

test_str_1 = /(\D8\D{2})/.match(table_cards.to_s) 
=> #<MatchData "|8♥|" 1:"|8♥|"> 

如果您尝试正则表达式是比较具体到你的卡,会发生什么?

test_str_1 = /(\|8[♥♦♣♠]\|)/.match(table_cards.to_s) 

在您的示例输出中,您没有看到Unicode心脏符号。相反,您的输出将打印作为Unicode启动器的“\ u”,但不会打印剩余的“2764”字符串。

  • 请参阅Tin Man的描述,其中描述了控制台的编码。如果他是正确的,那么我希望更具体的正则表达式能够成功,但仍然会输出错误的结果。

  • 查看David Knipe的评论,说它看起来像被截断,因为正则表达式只匹配4个字符。如果他是正确的,那么我希望更具体的正则表达式能够成功并打印正确的输出。

(这个答案的其余部分是Unix的典型代码;如果你在Windows上,请忽略其余部分......)

来显示您系统的语言设置,试试这个在你的shell:

echo $LC_ALL 
echo $LC_CTYPE 

如果他们不是 “UTF-8” 或类似的东西,试试这个在你的shell:

export LC_ALL=en_US.UTF-8 
export LC_CTYPE=en_US.UTF-8 

然后重新运行你的代码 - 一定要使用相同的shell。

如果一切正常,并希望将其永久保留,一个办法是增加这些位置:

# /etc/environment 
LC_ALL=en_US.UTF-8 
LC_CTYPE=en_US.UTF-8 

然后从你的.bashrc或者.zshrc或任何shell启动文件,你使用源代码该文件。

+0

这工作。有没有一个列出所有这些unicodes的网站?像“\ u2764”=♥?如果这样对我真的很有帮助。 – 2015-01-09 23:06:56

+0

是的 - 我会将其添加到答案中。 http://unicode-table.com/en/sets/ – joelparkerhenderson 2015-01-09 23:09:41

+0

我会公开承认你最初发布的内容大部分是在我的脑海中完成的。听起来像在Linux上工作,我非常有限。并且在windows的shell中写入$ cmd会导致错误,因为无法识别。但是你的第一位帮助我一吨!谢谢。感谢您的网站 – 2015-01-09 23:11:31