这是我的环境:客户端 - > iOS应用程序,服务器 - > PHP和MySQL.
从客户端到服务器的数据是通过HTTP POST完成的.
服务器到客户端的数据是用json完成的.
我想添加对emojis或任何utf8mb4字符的支持.我正在寻找在我的场景下处理这个问题的正确方法.
我的问题如下:
POST是否允许utf8mb4,或者我应该将客户端中的数据转换为普通utf8?
如果我的数据库有整理和字符集utf8mb4,这是否意味着我应该能够存储'raw'emojis?
我应该尝试使用utf8mb4在数据库中工作,还是更安全/更好/更支持在utf8和编码符号中工作?如果是这样,我应该使用哪种编码方法,以便它在Objective-C和PHP(以及未来的android版本的java)中完美运行?
现在我的数据库是utf8mb4但是在尝试存储原始表情符号时出错.另一方面,我可以存储非utf8符号,如¿或á.
当我在PHP中检索这个符号时,我首先需要执行SET CHARACTER SET utf8(如果我在utf8mb4中得到它们,则json_decode函数不起作用),然后对这些符号进行编码(例如,¿编码为\u00bf).
鉴于这个原型
option java_outer_classname = "FooProto";
message Foo {
string bar = 1;
}
Run Code Online (Sandbox Code Playgroud)
这个java类:
public class MyFoo {
String bar;
}
Run Code Online (Sandbox Code Playgroud)
这个映射器(使用 Mapstruct):
@Mapper
public interface FooMapper() {
FooProto.Foo toProtoFoo(MyFoo myFoo);
}
Run Code Online (Sandbox Code Playgroud)
当我有一个带有空栏的 MyFoo 实例并尝试将其映射到原型时,我得到一个 NullPointerException。
这是因为映射器自动生成的代码调用原型的自动生成方法,如下所示:
public Builder setBar(java.lang.String value) {
if (value == null) {
throw new NullPointerException();
}
bar_ = value;
onChanged();
return this;
}
Run Code Online (Sandbox Code Playgroud)
有什么办法可以避免这个问题吗?(这不涉及在映射之前清理 MyFoo 实例,使其没有空值)
有这个JS代码:
var prompter = (function(){
var prompt = document.createElement('div');
/* prompt-related stuff */
var closeBtn = document.createElement('button');
/* closeBtn stuff */
prompt.appendChild(closeBtn);
this.html = prompt;
this.show = (function(){
document.body.appendChild(this.html);
});
this.close = (function(){
document.body.removeChild(this.html);
});
});
Run Code Online (Sandbox Code Playgroud)
如果我做
var p = new prompter();
p.show();
Run Code Online (Sandbox Code Playgroud)
它确实显示了提示符,如果我这样做p.close();就会消失.
但我想要的是通过点击closeBtn它确实关闭.我有想法添加一个id提示,然后将属性onclick添加到按钮并通过它执行操作id,但这看起来真的很丑...