Главный ответ отличный. Вот что я должен был на обычной установке debian / php / mysql:
// storage
// debian. apparently already utf-8
// retrieval
// the mysql database was stored in utf-8,
// but apparently php was requesting iso. this worked:
// ***notice "utf8", without dash, this is a mysql encoding***
mysql_set_charset('utf8');
// delivery
// php.ini did not have a default charset,
// (it was commented out, shared host) and
// no http encoding was specified in the apache headers.
// this made apache send out a utf-8 header
// (and perhaps made php actually send out utf-8)
// ***notice "utf-8", with dash, this is a php encoding***
ini_set('default_charset','utf-8');
// submission
// this worked in all major browsers once apache
// was sending out the utf-8 header. i didnt add
// the accept-charset attribute.
// processing
// changed a few commands in php, like substr,
// to mb_substr
, которая была всем!
Из всего большого количества библиотек, которые у меня есть в моем текущем проекте. единственные примеры, которые я могу найти, находятся в библиотеке Google Guava , например com.google.common.annotations.GwtCompatible
.
Я не совсем уверен, почему они выбрали этот политика хранения, хотя, возможно, для поддержки инструментов, где инструменты читают сами файлы классов, а не проходят через API отражения. Я не уверен, что я действительно вижу смысл этого различия.
Минимальный пример
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.CLASS)
@interface RetentionClass {}
@Retention(RetentionPolicy.RUNTIME)
@interface RetentionRuntime {}
public static void main(String[] args) {
@RetentionClass
class C {}
assert C.class.getAnnotations().length == 0;
@RetentionRuntime
class D {}
assert D.class.getAnnotations().length == 1;
}
Если мы используем javap
в аннотированных классах, мы видим, что аннотированный класс Retention.CLASS
получает атрибут класса RuntimeInvisible :
#14 = Utf8 LRetentionClass;
[...]
RuntimeInvisibleAnnotations:
0: #14()
, в то время как аннотация Retention.RUNTIME
получает атрибут класса RuntimeVisible :
#14 = Utf8 LRetentionRuntime;
[...]
RuntimeVisibleAnnotations:
0: #14()
Таким образом, информация присутствует в обоих случаях в байт-коде.
Таким образом, Runtime.CLASS
можно использовать для связывания произвольных метаданных с классом, который могут использоваться инструментами манипуляции с байт-кодом, без вмешательства в поведение во время работы.
КЛАСС Аннотации используются в инструментах обфускатора, таких как http://proguard.sourceforge.net . Например, аннотация @KeepName отключает манипулирование именами, когда вам нужно, чтобы ваше имя класса не изменялось, чтобы иметь возможность вызывать методы типа Class.forName ().
RetentionPolicy.CLASS полезны при выполнении постобработки на уровне кода байта.
Пример:
https://github.com/thesmythgroup/DroidCook/blob /master/src/org/tsg/android/api/Annotations.java