если строки регулярных выражений и запросов являются многобайтовыми, похоже, они не работают правильно
Что такое «многобайтовый» в этом контексте? Строка, закодированная в байтах UTF-8? Специфичная для локали многобайтовая кодировка, например, GB?
Если вы не имеете дело с широкими (Unicode) строками изначально, вы не можете ожидать большей поддержки не-ASCII-символов, чем просто обнаружение их присутствия. Регулярное выражение POSIX не определяет какие-либо классы символов для байтов вне диапазона ASCII, поэтому оно не знает, что любой из байтов в "\ xe7 \ xb4 \ x99" (представление UTF-8 '紙') может рассматриваться слова-буквы; следовательно, он не видит границ слов.
Что представляет собой буква или слово в Юникоде, является более сложным вопросом, чем простое регулярное выражение ASCII. (И очевидно, что слово «по-китайски» является спорным само по себе.) Если все, что вы хотите обнаружить, это просто старые пробелы, вы можете сделать это явно:
(\s|^)紙張(\s|$)