Есть ли способ использовать FINDSTR с не-ASCII (в данном случае японскими / китайскими) символами в пакете? - PullRequest
1 голос
/ 28 марта 2020

У меня есть список японских кандзи и их произношения, сохраненные в текстовом файле (JouyouKanjiReadings.txt), например,

亜   ア
哀   アイ,あわれ,あわれむ
愛   アイ
悪   アク,オ,わるい
握   アク,にぎる
圧   アツ
(each gap is made by pressing TAB)

, и у меня есть такой скрипт

@echo off
set /p text=Enter here: 
echo %text%>Search.txt
echo.
findstr /G:"Search.txt" JouyouKanjiReadings.txt || echo No Results && pause > nul && exit
pause > nul

Однако, когда я запускаю скрипт, я всегда получаю «Нет результатов». Я пробовал с символами Engli sh, и все работало нормально. Я также попробовал тот же скрипт с этим

findstr "%text%" JouyouKanjiReadings.txt || echo No Results && pause > nul && exit

, но получил те же результаты. Есть ли способы обойти это? Кроме того, я правильно отображаю эти символы в командной строке, используя

chcp 65001

и другой шрифт.

1 Ответ

3 голосов
/ 28 марта 2020

Вам нужно использовать find (который поддерживает Юникод, но не регулярное выражение) вместо findstr (который поддерживает регулярное выражение, но не Юникод). См. Почему существуют программы FIND и FINDSTR с несвязанными наборами функций?

D:\kanji>chcp
Active code page: 65001

D:\kanji>find "哀" JouyouKanjiReadings.txt

---------- JOUYOUKANJIREADINGS.TXT
哀      アイ,あわれ,あわれむ

Перенаправление на NUL для подавления вывода, если он вам не нужен

Тем не менее, find тоже не очень хорошее решение. В настоящее время вы должны использовать PowerShell вместо cmd со всеми его особенностями из-за проблем совместимости. PowerShell полностью поддерживает Unicode и может запускать любые методы. NET framework. Для поиска строк вы можете использовать командлет Select-String или его псевдоним sls

PS D:\kanji> Select-String '握'  JouyouKanjiReadings.txt

JouyouKanjiReadings.txt:5:握    アク,にぎる

В противном случае вам даже не нужно использовать UTF-8 и кодовую страницу 65001. Просто сохраните файл в UTF-16 с BOM (это приведет к уменьшению размера файла, поскольку ваш файл содержит в основном японские символы), тогда find и sls автоматически выполнят поиск в UTF-16

Конечно, если имеется много существующего пакетного кода, вы можете вызвать PowerShell из cmd следующим образом:

powershell -Command "Select-String '哀'  JouyouKanjiReadings.txt"

Но если он полностью новый, просто избегайте хлопот и используйте PowerShell

.
...