Мне кажется, что они правильно хранятся, но вы неправильно их интерпретируете, когда читаете их. ♥
и ☆
в конечном итоге станут многобайтовыми символами в кодировке UTF-8. Держу пари, если вы посмотрите на эту многобайтовую кодировку, вы увидите, что она такая же, как однобайтовая кодировка для ♥
и ☆
соответственно.
Редактировать: добавление деталей.
Как видно из следующей таблицы, интерпретация символов UTF-8, как если бы они были закодированы как Windows Latin-1, дает результаты, которые вы видите.
UTF-8 character Hex
♥ e2 99 a5
☆ e2 98 86
Windows Latin-1 Hex
â e2
™ 99
¥ a5
˜ 98
† 86