gpt4 book ai didi

python - 在 Flask/Python 中处理表情符号的正确方法是什么?

转载 作者:行者123 更新时间:2023-11-28 16:36:17 25 4
gpt4 key购买 nike

我正在开发一个 API,我对表情符号 Flask/Python+表情符号编码越来越着迷:P

在本地服务器中我没有问题,表情符号图标“占据了字符串总长度的两个位置”,客户端(用 HTML+Javascript 编写)以相同的方式执行此操作。但是当我将它部署到 AWS EB 时,表情符号图标“只占一个位置”,并且字符串的总长度更小,我完全不知道为什么会这样。.

我写了一个小代码示例来说明正在发生的事情:

@api10.route('/prueba2', methods=['GET','POST'])
def prueba2():
que = request.form.get("que", None)

SEP = "\n"
if request.form.get("web", None) == "ok":
SEP = "<br />"

out = "QUE: '%s'%s" % (que,SEP)
out += "REP: '%s'%s%s" % (repr(que),SEP,SEP)
out += "LENGTH: '%d'%s%s" % (len(que),SEP,SEP)
out += "TYPE: '%s'%s%s" % (str(type(que)).replace("<", ""),SEP,SEP)
for index,letter in enumerate(que):
out += "%d -> %s%s" % (index,letter,SEP)

return out, 200, {'Content-Type': 'text/html; charset=utf-8'}

本地响应: Local Response in the Chrome Postman

AWS EB 响应: AWS EB Response in the Chrome Postman

两者的响应 header 相同:

Content-Type →text/html; charset=utf-8
Date →Tue, 09 Sep 2014 11:47:03 GMT
Server →Werkzeug/0.9.6 Python/2.6.8

但在 AWS EB 中“连接”“保持事件”(当然“内容长度”不相等)

两种实现都在 Python 2.6 上运行(EC2 使用该版本,在本地我有一个 Virtualenv whit python26)

最佳答案

好吧,我现在知道为什么会这样了......

> 服务器端

虽然这两个版本都运行在 Python 2.6 上,AWS EB Python 版本编译时支持 UCS4,本地 (Mac OS X) Python 2.6 编译时支持 UCS2。 More info about UCS here .

AWS EB EC2:
>>> import sys
>>> print sys.maxunicode
1114111
本地Python 2.6.8安装:
>>> import sys
>>> print sys.maxunicode
65535

最后我决定我们的项目使用支持 UCS4 的 Python 2.6 更好,所以我必须更新我的 Python 安装(Mac OS X 10.9.4):

下载并安装 Python 2.6.8(与 EC2 实例相同):

$ curl -O https://www.python.org/ftp/python/2.6.8/Python-2.6.8.tgz
$ tar xzvf Python-2.6.8.tgz
$ cd Python-2.6.8
$ ./configure --disable-framework --disable-toolbox-glue OPT="-fast -arch x86_64 -Wall -Wstrict-prototypes -fno-common -fPIC" --enable-unicode=ucs4 LDFLAGS="-arch x86_64"
$ make
$ sudo make install

创建新的 virtualenv 并安装依赖项:

$ virtualenv -p /usr/local/bin/python2.6 venv_ayf_eb_26
$ . venv_ayf_eb_26/bin/activate
$ pip install -r requirements.txt

>客户端

现在在客户端 (Javascript) 中,我们需要更新循环字符串的方式,因为 ECMAScript 5-使用 UCS2 .

所以要读取我们使用的“真实字符串/符号长度”:

String.prototype.getSymbols = function() {
var length = this.length;
var index = -1;
var output = [];
var character;
var charCode;
while (++index < length) {
character = this.charAt(index);
charCode = character.charCodeAt(0);
if (charCode >= 0xD800 && charCode <= 0xDBFF) {
// note: this doesn’t account for lone high surrogates
output.push(character + this.charAt(++index));
} else {
output.push(character);
}
}
return output;
};
String.prototype.realLength = function() {
return this.getSymbols().length;
};

循环:

// GET original_text over REST API
text = original_text.getSymbols();
for ( var i=0; i<original_text.length; i++) { /* DO SOMETHING */ }

引用资料

  1. The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) - 乔尔·斯波尔斯基
  2. Unipain: Pragmatic Unicode - 内德·巴切尔德
  3. Universal Character Set - 维基百科
  4. ECMAScript - 维基百科
  5. ECMAScript® Language Specification (5.1) - Ecma 国际
  6. JavaScript has a Unicode problem - 马蒂亚斯·拜恩斯
  7. Python, convert 4-byte char to avoid MySQL error “Incorrect string value:” - 计算器
  8. How to find out if Python is compiled with UCS-2 or UCS-4? - 计算器

关于python - 在 Flask/Python 中处理表情符号的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25744493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com