Программа Strings (1) с поддержкой Unicode - PullRequest
8 голосов
/ 23 февраля 2009

У кого-нибудь есть пример кода для программы с поддержкой юникода? Язык программирования не имеет значения. Я хочу что-то, что, по сути, делает то же самое, что и Unix-команда "strings", но также работает с текстом Unicode (UTF-16 или UTF-8), вытягивая символы английского языка и знаки препинания. (Меня интересуют только английские символы, а не любой другой алфавит).

Спасибо!

Ответы [ 2 ]

8 голосов
/ 23 февраля 2009

Вы просто хотите его использовать или по какой-то причине настаиваете на коде?

В моей системе Debian, похоже, команда strings может сделать это из коробки. Смотрите отрывок из справочной страницы:

  --encoding=encoding
       Select the character encoding of the strings that are to be found.  Possible values for encoding are: s = single-7-bit-byte characters (ASCII, ISO  8859,
       etc.,  default),  S  = single-8-bit-byte characters, b = 16-bit bigendian, l = 16-bit littleendian, B = 32-bit bigendian, L = 32-bit littleendian. Useful
       for finding wide character strings.

Редактировать: ОК. Я не знаю C #, так что это может быть немного сложно, но в основном вам нужно искать последовательности чередующихся нулей и английских символов.

byte b;
int i=0;
while(!endOfInput()) {
  b=getNextByte();
LoopBegin:
  if(!isEnglish(b)) {
    if(i>0) // report successful match of length i
    i=0;
    continue;
  }
  if(endOfInput()) break;
  if((b=getNextByte())!=0)
    goto LoopBegin;
  i++; // found another character
}

Это должно работать для little-endian.

1 голос
/ 18 февраля 2014

У меня была похожая проблема, и я попробовал "strings -e ...", но я только нашел варианты кодирования символов фиксированной ширины. (Кодировка UTF-8 имеет переменную ширину).

Запомните, по умолчанию для символов вне ascii нужны дополнительные опции strings. Это включает в себя почти все строки не на английском языке.

Тем не менее вывод "-e S" (одиночные 8-битные символы) включает символы UTF-8.

Я написал очень простой (на ред.) Скрипт Perl, который применяет «strings -e S ... | iconv ...» к входным файлам.

Я считаю, что его легко настроить под конкретные ограничения. Использование: utf8strings [options] file*

#!/usr/bin/perl -s

our ($all,$windows,$enc);   ## use -all ignore the "3 letters word" restriction
use strict;
use utf8::all;

$enc = "ms-ansi" if     $windows;  ##
$enc = "utf8"    unless $enc    ;  ## defaul encoding=utf8
my $iconv = "iconv -c -f $enc -t utf8 |";

for (@ARGV){ s/(.*)/strings -e S '$1'| $iconv/;}

my $word=qr/[a-zçáéíóúâêôàèìòùüãõ]{3}/i;   # adapt this to your case

while(<>){
   # next if /regular expressions for common garbage/; 
   print    if ($all or /$word/);
}

В некоторых ситуациях этот подход создает дополнительный мусор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...