В PHP-строках следует помнить, что они представляют собой потоки байтов. Если вы хотите получить данные в правильном наборе символов (для всего, что вы делаете), вы должны сделать это явно через какую-то функцию или фильтр. Это все довольно низкоуровневое.
В зависимости от ваших настроек, вам может понадобиться знать внутренний набор символов строк в базе данных, но, по крайней мере, вам нужно знать, какой набор символов отправляет база данных в PHP (потому что, помните, в PHP это просто поток байтов).
Тогда вы должны знать целевой набор символов (и, возможно, указать его, что вам действительно нужно в любом случае). Например, предположим, что вы получаете utf-8 из базы данных, но хотите отправить латинский-1 (и, следовательно, base64 или q-printable, закодированный как 'Content-Transfer-Encoding'):
$send_string = base64_encode(utf8_decode($database_string));
Конечно, в этом случае вы должны знать, что все символы utf-8 существуют в наборе символов latin-1, и вам, вероятно, не нужен base64 (к сожалению, PHP не имеет хорошего q- пригодная для печати функция кодирования, хотя, как ни странно, она подходит для декодирования), и если вы не говорите о utf-8 <=> latin-1, вам нужно вместо этого вывести функции mbstring.
Что касается консоли, вам нужно знать, что получает PHP при вводе специальных символов с консоли, что, вероятно, зависит от настроек оболочки и / или PHP. Но помните, что PHP понимает строки только как байтовый байтовый байт, и вы должны быть в состоянии разобраться с этим.