2015-04-10 5 views
0

Я работаю над автоматической программой для японских предложений, а отсутствующий символ в предложении будет представлен как пробел.Как найти место в японской строке на C++?

Я читаю от 2-х файлов ...

входного файла:

 はアビガイル 
おはよう くん 

Файл словаря:

私はアビガイル 
おはよう花くん 

Недостающие символы 私 и 花 представлены как пространство

Как я могу найти пространство из входного файла?

Я пробовал lineFromFile.find(" "), но он возвращает корзину, так как это не обычные английские символы. Также попробовал lineFromFile.find('\0x20') и lineFromFile.find(' ')

Я также попытался string lineFromFile = u8"あび" но префикс u8 получает ошибка "идентификатор 'u8' не определен"

Я использую C++, Visual Studio 2013, GCC 4.8.3 и мой текущий код страница Unicode (UTF-8 с подписью)

Если вы думаете, что это дубликат вопрос, пожалуйста прокомментируйте ссылку на тот же вопрос ANSWERED

Мой план:

  1. Найти пространство от линии входного файла (возвращать одно и то spaceIndex)
  2. Сохранить строку из файла словаря в string temp
  3. Заменить символ в spaceIndex в переменной temp будет
  4. Сравните строку из входного файла с temp
  5. Повторить до тех пор, пока совпадение не будет найдено или пока не будет найден файл словаря

Пожалуйста, помогите, у меня есть 3 дня: '(

+2

Что вы подразумеваете под "return trash"?Пространство в UTF-8 является одиночным 1-байтовым символом, вы должны найти его в порядке. Что возвращает 'lineFromFile.find ('')'? Также я не знаю о Visual Studio, но 'u8" あ び "' должен отлично работать с GCC 4.8 –

+4

Ваш план не будет работать, потому что хотя пробел занимает один символ в строке, символ в том же позиция в файле словаря будет многобайтовым символом, поэтому замена одного байта из строки словаря на входную строку не будет работать. Вы должны преобразовать строки в 'u32string' перед их обработкой, так что каждый символ принимает один символ' char32_t', и вы можете заменить отдельные символы на одно и то же смещение в строках. В Visual Studio вы можете использовать 'wstring_convert' и' codecvt 'для преобразования, но GCC 4.8 не поддерживает эти типы. –

+0

@JonathanWakely, когда я напечатал возвращение найти его напечатано '4294967295'. 'lineFromFile.find ('')' возвращает то же самое. Я googled, что u8 должен был сработать, но он просто не делает, должен ли я # включать нечто, отличное от '', '', '', ''? –

ответ

1

Отсутствующие символы 私 и 花 представлены как пространство

Нет, они не являются. Глядя на  はアビガイル в шестнадцатеричном редакторе, первый символ равен '\u3000', который равен IDEOGRAPHIC SPACE, а не SPACE.

Так, чтобы найти его вам нужно использовать find(u8"\u3000") или find("\xe3\x80\x80)

Если вам повезет, и все японские символы в ваших входных файлах кодируются в виде трех байтов в кодировке UTF-8, то вы можете рассматривать их как зафиксировав позиции в строках и заменить блоки из трех байтов из одной строки в другую.

+0

Благодарим за помощь! Найдите пространство, используя 'find (" \ xe3 \ x80 \ x80 ")'. Я также думаю, что вы правы в том, что он хранится как 3 байта, потому что я попробовал его с помощью 'こ に ち わ く ん', и он вернулся 12. Это мой первый раз, когда мы сталкиваемся с идеографическим пространством. Я думал, что пространство - это просто пространство, мне действительно нужно изучить больше символов юникода :)) Еще раз спасибо! : D –