Многобайтовые символы в libc regcomp и regexec

Есть ли в любом случае, чтобы получить libc6регулярные выражения regcomp а также regexec правильно работать с многобайтовыми символами?

Например, если мой шаблон - символы utf8 猫机+猫найти совпадение в кодированной строке utf8 猫机机机猫 потерпит неудачу там, где это должно преуспеть.

Я думаю, что это потому, что характер байтовое представление \xe6\x9c\xbaи + совпадает с одним или несколькими байтами \xba, Я могу заставить этот экземпляр работать, поместив круглые скобки вокруг каждого многобайтового символа в шаблоне, но так как это для приложения, я не могу требовать, чтобы пользователи делали это.

Есть ли способ пометить шаблон или строку для соответствия как содержащие символы utf8? Возможно, рассказывать libc сохранить шаблон как wchar вместо char?

3 ответа

Решение

Можете ли вы использовать регулярное выражение для создания своего регулярного выражения? Вот пример javascript (хотя я знаю, что вы не используете js):

function Examp () {
  var uString = "猫机+猫+猫ymg+sah猫";
  var plussed = uString.replace(/(.)(?=[\+\*])/ig,"($1)");
  console.log("Starting with string: " + uString + "\r\n" + "Result: " + plussed);
  uString = "猫机+猫*猫ymg+s\\a+I+h猫";
  plussed = uString.replace(/(\\?.)(?=[\+\*])/ig,"($1)");
  console.log("You can even take this a step further and account for a character being escaped, if that's a consideration.")
  console.log("Starting with string: " + uString + "\r\n" + "Result: " + plussed);
}
<input type="button" value="Run" onclick="Examp()" />

Согласно странице руководства, glibc понимает регулярное выражение POSIX. В регулярном выражении POSIX нет поддержки юникода как такового. См. Этот пост, чтобы узнать, кроме стандарта, который освещает этот момент. Это означает, что вы также можете забыть об UTF. Это также означает, что в какой бы языковой среде вы ни находились, многобайтовые символы не подходят.

В сообщении, о котором я упоминал (а также в этом), предлагается использовать некоторую библиотеку регулярных выражений с поддержкой Unicode, такую ​​как pcre. Если вам интересно, pcre предоставляет поддельный интерфейс posix с добавлением нестандартного флага REG_UTF. Вам не придется переписывать свой код, за исключением директивы #include и добавления REG_UTF на этапе компиляции.

Надеюсь, это покрывает ваши потребности.

Есть ли способ пометить шаблон или строку для соответствия как содержащие символы utf8?

Я подозреваю что LC_CTYPE переменная окружения (или другие связанные настройки локали) - это способ сделать regcomp / regexec понять вашу кодировку.

По крайней мере, grep программа, кажется, принимает это во внимание, как показано в /questions/38552166/chto-sostavlyaet-odin-simvol-dlya-regcomp-kakaya-mnogobajtovaya-kodirovka-opredelyaet-eto/38552174#38552174; Я не проверял это с regcomp функция.

Другие вопросы по тегам