Я отправляю данные (String-text) из Android в PHP и проверяю, правильно ли они отправлены. Я использую MD5, чтобы сделать это. Все было хорошо, пока я не отправил String с польскими символами (ł, ą, ć, ó и т. Д.). Хеши не совпадают, если я использую символы польского языка, но когда я использую нормальные символы, все в порядке. Я видел подобные вопросы, но в моем случае хэши обычно совпадают, только некоторые символы создают проблемы. Я пытался решить эту проблему с помощью ответов на эти вопросы, но это не помогло.
Мой код Java (Android):
static final String md5(final String s) {
String hash = "";
try {
MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
digest.update(s.getBytes());
byte messageDigest[] = digest.digest();
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < messageDigest.length; i++) {
String h = Integer.toHexString(0xFF & messageDigest[i]);
while (h.length() < 2)
h = "0" + h;
hexString.append(h);
}
hash = hexString.toString();
}
catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return hash;
}
Мой код PHP:
@ini_set (‘default_charset’, ‘UTF-8’);
@ini_set ( ‘mbstring.internal_encoding’, ‘UTF-8’);
$dbhmq = @mysql_connect('host', 'user', 'pass');
@mysql_query("SET character_set_results=utf8", $dbhmq);
if ($dbhmq === false)
throwException('DB error (connect): '.mysql_error());
else
@mysql_select_db('dbname', $dbhmq) or throwException('DB error (db select): '.mysql_error());
@mysql_query("set names 'utf8'", $dbhmq);
@mysql_set_charset('utf8', $dbhmq);
//here I insert $_POST['text_from_android'] to datebase
//$_POST['md5_from_android'] hash from Android
if(md5(mb_convert_encoding($from_datebase['text_from_android'], "UTF-8")) == $_POST['md5_from_android']){
//ok (works for text like "ka dlkajs dliahdoi h00* !@Y #(O Ihd dp h08! E)"}
else{
//ERROR! (occur for text like "ka dlóajs łś łoś krowa h00* !@Y #(O Ihd dp h08! E)"}
//I can't edit mysql config file and php/apache config file.
/* PHP info:
PHP Version => 5.4.31
Multibyte character support => enabled
Multibyte (japanese) regex support => enabled
Multibyte regex (oniguruma) backtrack check => On
Multibyte regex (oniguruma) version => 4.7.1
Multibyte Support => enabled
Multibyte string engine => libmbfl
mssql.charset => no value => no value
session.hash_bits_per_character => 4 => 4
default_charset => no value => no value
CharConv => No
mbstring.substitute_character => no value => no value
ibase.default_charset => no value => no value
MHASH support => Enabled
mhash
MHASH API Version => Emulated Support
Hashing Engines => md2 md4 md5 sha1 sha224 sha256 sha384 sha512 ripemd128 ripemd160 ripemd256 ripemd320 whirlpool tiger128,3 tiger160,3 tiger192,3 tiger128,4 tiger160,4 tiger192,4 snefru snefru256 gost adler32 crc32 crc32b fnv132 fnv164 joaat haval128,3 haval160,3 haval192,3 haval224,3 haval256,3 haval128,4 haval160,4 haval192,4 haval224,4 haval256,4 haval128,5 haval160,5 haval192,5 haval224,5 haval256,5
*/
//MySQL Collation method: utf8_general_ci
Я не буду изменять код Android (только правильный код PHP), если это возможно
Задача ещё не решена.
Других решений пока нет …