Я использую gammu-smsd на ubuntu 12.04 в качестве своего sms-шлюза. Он сканирует информацию с моего модема и вставляет ее в базу данных postgresql. Судя по всему, он пытался вставить что-то в почтовый ящик с недопустимыми символами согласно / var / log / syslog:
Oct 28 16:22:15 porkypig gammu-smsd[14936]: SQL failed: INSERT INTO inbox (ReceivingDateTime, Text, SenderNumber, Coding, SMSCNumber, UDH, Class, TextDecoded, RecipientID) VALUES ('2013-10-24 20:03:19', 'D83DDC4D','+13053057707','Unicode_No_Compression','+14044550007','','-1','<d83d><dc4d>','')
Oct 28 16:22:15 porkypig gammu-smsd[14936]: Error: ERROR: invalid byte sequence for encoding "UTF8": 0xeda0bd#012HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".
Oct 28 16:22:15 porkypig gammu-smsd[14936]: Query failed, checking connection
Теперь, когда я пытаюсь запустить сервер gammu-smsd:
sudo /etc/init.d/gammu-smsd start
он вылетает с тем же выводом в системном журнале, как я показал выше.
Что я могу сделать, чтобы это исправить?
Postgres уже сказал вам, что вы можете сделать, чтобы это исправить:
Oct 28 16:22:15 porkypig gammu-smsd[14936]: Error: ERROR: invalid byte sequence for encoding "UTF8": 0xeda0bd#012HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".
invalid byte sequence for encoding "UTF8": 0xeda0bd#012
«Ваш клиент (gammu-smsd
в этом случае) пришлите мне тарабарщину. Я не говорю тарабарщины, я говорю по UTF-8 ».
This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".
"Скажите, какую кодировку использует ваш клиент, либо установив кодировку базы данных (что потребовало бы ее удаления и повторного создания), либо установив для вашего клиента client_encoding
соответственно. "
Если вы не знаете, в какой кодировке gammu-smsd
пытается использовать, воссоздайте базу данных с SQL_ASCII encoding
который в основном говорит Postgres не заботиться о том, что вы ему передаете.
Это отговорка, но это быстрое решение.
Настоящая проблема здесь в том, что gammu-smsd пытается отправить UTF-16 в базу данных UTF-8:
>>> str = '👍'
>>> str
'👍'
>>> str.encode('utf-16-be')
b'\xd8=\xdcM'
>>> for c in str.encode('utf-16-be'): print('{:x}'.format(c))
d8
3d
dc
4d
Он должен отправлять:
>>> str.encode('utf-8')
b'\xf0\x9f\x91\x8d'
(смотрите также http://www.fileformat.info/info/unicode/char/1F44D/index.htm)