2015-01-09 26 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