2015-01-09 7 views
3

Следующий код - это то, что я начинаю тестировать для использования в игре «Texas Hold Em», над которой я работаю.Многобайтовая символьная проблема с .match?

Мой вопрос в том, почему при запуске нижеследующего кода помехи, содержащие «♥», возвращают «\ u» в его место. Я чувствую себя уверенным, что этот многобайтовый символ вызывает проблему во втором puts, я заменил ♦ на 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

OS? Какой терминал? – Anthony

+2

Печать символов Юникода на экране включает в себя больше, чем ваш скрипт Ruby, имеющий правильную кодировку. Это также требует, чтобы ваша консоль использовала тот же набор кодов. Если это настроено на что-то другое, то такие вещи могут произойти. Обычно Windows использует Win1252 или ISO-8859-1, а определения символов не соответствуют вызывающему странному выводу. –

+1

Действительно ли это связано с 'match'? Вы пробовали 'puts '♥" '? – Stefan

ответ

1

«\ u», который вы видите, является индикатором строки Unicode.

Например, символ Unicode «HEAVY BLACK HEART» (U + 2764) может быть напечатан как «\ u2764».

Дружеский характер перечисляя сайт Юникода http://unicode-table.com/en/sets/

Вы в состоянии запустить интерактивный рубин в своей скорлупе и напечатать сердце, как это?

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) 

В вашем примере вывода вы не видите символ сердца Юникода, как хотите. Вместо этого на вашем выходе печатается «\ u», который является стартером Unicode, но затем не печатает остальную ожидаемую строку, которая является «2764».

  • Просмотреть комментарий пользователя Tin Man, который описывает кодировку для вашей консоли. Если он прав, то я ожидаю, что более специфичное регулярное выражение будет успешным, но все равно напечатает неверный вывод.

  • Просмотреть комментарий David Knipe, в котором говорится, что он выглядит усеченным, потому что регулярное выражение соответствует только 4 символам. Если он прав, то я ожидаю, что более конкретное регулярное выражение будет успешным, а также напечатает правильный результат.

(Остальная часть этого ответа типична для Unix, если вы находитесь в Windows, игнорируйте остальные здесь ...)

Чтобы показать языковые настройки системы, попробуйте это в оболочке:

echo $LC_ALL 
echo $LC_CTYPE 

Если они не «UTF-8» или что-то подобное, попробуйте это в оболочке:

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

Затем повторно запустите свой код - обязательно используйте ту же оболочку.

Если это работает, и вы хотите сделать это постоянным, один способ добавить их здесь:

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

Затем источник файл из .bashrc или .zshrc или любой другой файл запуска оболочки вы используете.

+0

Это сработало. Есть ли сайт со списком всех этих юникодов? как «\ u2764» = ♥? Если так, то это действительно полезно для меня. –

+0

Да - добавлю это к ответу. http://unicode-table.com/en/sets/ – joelparkerhenderson

+0

Я буду открыто признавать, что вы добавили после того, как ваш первоначальный пост был полностью над моей головой. Звучит нечто похожее на работу в Linux, на котором я очень ограничен. и $ cmd, написанный в оболочке Windows, дает ошибку, которая не распознается. Но ваш первый бит помогает мне тонну! Благодарю. И спасибо за сайт –