GNU coreutils tr
имеет проблемы с многобайтовыми символами - вместо этого он рассматривает их как последовательность однобайтовых символов.
Учитывая это, то, что вы видите в Linux, "ожидаемо":
$ echo – | od -t x1
0000000 e2 80 93 0a
0000004
$ echo ’ | od -t x1
0000000 e2 80 99 0a
0000004
$ echo – | tr ’ X | od -t x1
0000000 58 58 93 0a
0000004
EDIT:
Для набора утилит, совместимых с UTF-8, вы, возможно, захотите взглянуть на Heirloom Toolchest . Он содержит реализацию tr
, которая, очевидно, имеет поддержку UTF-8, хотя я не проверял ее.