PostgreSQL + PHP + UTF8 = недопустимая последовательность байта для кодирования

Java всегда передача значением . К сожалению, когда мы передаем значение объекта, мы передаем ссылка к нему. Это сбивает с толку новичков.

Это идет как это:

public static void main(String[] args) {
    Dog aDog = new Dog("Max");
    Dog oldDog = aDog;

    // we pass the object to foo
    foo(aDog);
    // aDog variable is still pointing to the "Max" dog when foo(...) returns
    aDog.getName().equals("Max"); // true
    aDog.getName().equals("Fifi"); // false
    aDog == oldDog; // true
}

public static void foo(Dog d) {
    d.getName().equals("Max"); // true
    // change d inside of foo() to point to a new Dog instance "Fifi"
    d = new Dog("Fifi");
    d.getName().equals("Fifi"); // true
}

В примере выше aDog.getName() все еще возвратится "Max". Значение aDog в main не изменяется в функции foo с Dog "Fifi", когда ссылка на объект передается значением. Если бы это было передано ссылкой, то aDog.getName() в [1 110] возвратился бы "Fifi" после вызова к [1 112].

Аналогично:

public static void main(String[] args) {
    Dog aDog = new Dog("Max");
    Dog oldDog = aDog;

    foo(aDog);
    // when foo(...) returns, the name of the dog has been changed to "Fifi"
    aDog.getName().equals("Fifi"); // true
    // but it is still the same dog:
    aDog == oldDog; // true
}

public static void foo(Dog d) {
    d.getName().equals("Max"); // true
    // this changes the name of d to be "Fifi"
    d.setName("Fifi");
}

В вышеупомянутом примере, Fifi имя собаки после вызова к [1 114], потому что имя объекта было определено в foo(...). Любые операции, который foo работает на [1 117], таковы, что во всех практических целях они выполняются на [1 118], но не возможно изменить значение переменной aDog самой.

10
задан unmounted 23 December 2009 в 08:09
поделиться

2 ответа

BTW, an ASCII string is exactly the same in UTF-8 because they share the same first 127 characters; so "Hello" in ASCII is exactly the same as "Hello" in UTF-8, there's no conversion needed.

The collation in the table may be UTF-8 but you may not be fetching information from it in the same encoding. Now if you have trouble with information you give to pg_escape_string it's probably because you're assuming content fetched from MySQL is encoded in UTF-8 while it's not. I suggest you look at this page on MySQL documentation and see the encoding of your connection; you're probably fetching from a table where the collation is UTF-8 but you're connection is something like Latin-1 (where special characters such as çéèêöà etc won't be encoded in UTF-8).

1
ответ дан 4 December 2019 в 02:50
поделиться

Скорее всего, данные в вашей базе данных MySQL не UTF8. Это довольно распространенный сценарий. MySQL, по крайней мере, раньше не делал никакой надлежащей проверки данных, поэтому он принимал все, что вы бросали в него, как UTF8, если только ваш клиент утверждал, что это UTF8. Возможно, они уже исправили это (или нет, я не знаю, считают ли они это проблемой), но вы, возможно, уже неправильно закодировали данные в db. PostgreSQL, конечно, выполняет полную валидацию при загрузке, и, таким образом, может не получиться.

Возможно, вы захотите подать данные через что-то вроде iconv, что можно настроить на игнорирование неизвестных символов, или преобразовать их в "лучшие догадки".

6
ответ дан 4 December 2019 в 02:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: