JSON a BSON mohou kódovat/dekódovat pouze platné řetězce UTF-8, pokud vaše data (včetně vstupu) nejsou UTF-8, musíte je převést, než je předáte jakémukoli systému závislému na JSON, například takto:
$string = iconv('UTF-8', 'UTF-8//IGNORE', $string); // or
$string = iconv('UTF-8', 'UTF-8//TRANSLIT', $string); // or even
$string = iconv('UTF-8', 'UTF-8//TRANSLIT//IGNORE', $string); // not sure how this behaves
Osobně preferuji první možnost, viz iconv()
manuálová stránka. Mezi další alternativy patří:
mb_convert_encoding()
utf8_encode(utf8_decode($string))
Vždy byste se měli ujistit, že vaše řetězce mají kódování UTF-8, a to i ty zadané uživatelem, ale protože jste zmínili, že migrujete z MySQL na MongoDB, zkusili jste exportovat vaši aktuální databázi do CSV a použít importní skripty, které jsou součástí dodávky s Mongo? Měli by to zvládnout...
UPRAVIT: Zmínil jsem, že BSON zvládne pouze UTF-8, ale nejsem si jistý, zda je to přesně pravda, mám mlhavou představu, že BSON používá UTF-16 nebo UTF-32 pro kódování / dekódování dat, ale nemohu to zkontrolovat nyní.