flask本地主机和heroku服务器之间阿拉伯文本的不同utf-8编码

问题描述 投票:0回答:0

我有一个flask应用程序,该应用程序基本上获取了一些阿拉伯国家名称,并通过REST API以json形式发送它们。 我已经将它部署在heroku上,虽然仅从数据库中获取值时就可以使用它而没有任何大的麻烦,但是我遇到了这段特殊的代码问题,该代码从我声明的字典中获取国家/地区名称该应用程序,并在检测到相似的国家/地区名称时将其国家/地区代码与发送频率一起发送给我,这些频率必须从数据库中获取。

@app.route('/getCountries', methods=['GET'])
def get_countries():
output = []
countries = {'إيران': 'IR', 'الولايات المتحدة': 'US', 'جزر جوادلوب': 'GP', 'آيسلندا': 'IS', 'أثيوبيا': 'ET', 'أذربيجان': 'AZ',
             'أراض فرنسية جنوبية': 'TF', 'أرمينيا': 'AM', 'أروبا': 'AW', 'أستراليا': 'AU', 'ألبانيا': 'AL',
             'ألمانيا': 'DE', 'أنتاركتيكا': 'AQ', 'أنتيغوا/بربودا': 'AG', 'أنجويلا': 'AI', 'أندورا': 'AD',
             'أندونيسيا': 'ID', 'أنغولا': 'AO', 'أورغواي': 'UY', 'أوزباكستان': 'UZ', 'أوغندا': 'UG',
             'أوكرانيا': 'UA', 'أيرلندا': 'IE', 'إريتريا': 'ER', 'إسبانيا': 'ES', 'إكوادور': 'EC',
             'إلسلفادور': 'SV', 'إيطاليا': 'IT', 'استونيا': 'EE', 'الأرجنتين': 'AR', 'الأردن': 'JO',
             'الإمارات العربية المتحدة': 'AE', 'الباهاماس': 'BS', 'البحرين': 'BH', 'أفغانستان': 'AF',
             'البرازيل': 'BR', 'البرتغال': 'PT', 'البوسنة/الهرسك': 'BA', 'الجبل الأسو': 'ME', 'الجزائر': 'DZ',
             'الجزر العذراء الأمريكي': 'VI', 'الجزر العذراء البريطانية': 'VG', 'الجمهورية التشيكية': 'CZ',
             'الجمهورية الدومينيكية': 'DO', 'الدانمارك': 'DK', 'الرأس الأخضر': 'CV', 'السنغال': 'SN',
             'السودان': 'SD', 'السويد': 'SE', 'الصحراء الغربية': 'EH', 'الصومال': 'SO', 'الصين': 'CN',
             'العراق': 'IQ', 'الغابون': 'GA', 'الفليبين': 'PH', 'الكونغو': 'CG', 'الكويت': 'KW', 'المالديف': 'MV',
             'المغرب': 'MA', 'المكسيك': 'MX', 'المملكة العربية السعودية': 'SA', 'المملكة المتحدة': 'GB',
             'النرويج': 'NO', 'النمسا': 'AT', 'النيجر': 'NE', 'الهند': 'IN', 'اليابان': 'JP', 'اليمن': 'YE',
             'اليونان': 'GR', 'بابوا غينيا الجديدة': 'PG', 'باراغواي': 'PY', 'باكستان': 'PK', 'بالاو': 'PW',
             'بربادوس': 'BB', 'بروني': 'BN', 'بلجيكا': 'BE', 'بلغاريا': 'BG', 'بنغلاديش': 'BD', 'بنما': 'PA',
             'بنين': 'BJ', 'بوتان': 'BT', 'بوتسوانا': 'BW', 'بورتوريكو': 'PR', 'بوركينا فاسو': 'BF',
             'بوروندي': 'BI', 'بولندا': 'PL', 'بوليفيا': 'BO', 'بولينيزيا الفرنسية': 'PF', 'بيتكيرن': 'PN',
             'بيرو': 'PE', 'بيليز': 'BZ', 'تايلندا': 'TH', 'تايوان': 'TW', 'تركمانستان': 'TM', 'تركيا': 'TR',
             'ترينيداد وتوباغو': 'TT', 'تشاد': 'TD', 'تنزانيا': 'TZ', 'توغو': 'TG', 'توفالو': 'TV', 'توكلو': 'TK',
             'تونس': 'TN', 'تونغا': 'TO', 'تيمور الشرقية': 'TL', 'جبل طارق': 'GI', 'جرينلاند': 'GL',
             'جزر أولند': 'AX', 'جزر الأنتيل الهولندي': 'AN', 'جزر القمر': 'KM',
             'جزر الولايات المتحدة الصغيرة': 'UM', 'جزر برمود': 'BM', 'جزر توركس/كايكوس': 'TC', 'جزر سليمان': 'SB',
             'جزر فارو': 'FO', 'جزر فوكلاند(المالديف)': 'FK', 'جزر كايمان': 'KY', 'جزر كوك': 'CK',
             'جزر كوكس(كيلينغ)': 'CC', 'جزر مارشال': 'MH', 'جزر ماريانا الشمالية': 'MP', 'جزيرة بوفيه': 'BV',
             'جزيرة كريسماس': 'CX', 'جزيرة مان': 'IM', 'جزيرة نورفولك': 'NF', 'جزيرة هيرد/جزر ماكدونالد': 'HM',
             'جمايكا': 'JM', 'جمهورية أفريقيا الوسطى': 'CF', 'جنوب أفريقيا': 'ZA', 'جوام': 'GU',
             'جورجيا الجنوبية/جزر ساندويتش': 'GS', 'جيبوتي': 'DJ', 'جيرزي': 'JE', 'جيورجيا': 'GE',
             'دولة مدينة الفاتيكان': 'VA', 'دومينيكا': 'DM', 'رواندا': 'RW', 'روسيا': 'RU', 'روسيا البيضاء': 'BY',
             'رومانيا': 'RO', 'ريونيون': 'RE', 'زامبيا': 'ZM', 'زمبابوي': 'ZW', 'ساحل العاج': 'CI', 'ساموا': 'WS',
             'ساموا الأمريكية': 'AS', 'سان مارينو': 'SM', 'سانت بارتليمي': 'BL', 'سانت بيير/ميكلون': 'PM',
             'سانت فنسنت/الجرينادين': 'VC', 'سانت كيتس/نيفيس': 'KN', 'سانت لوسيا': 'LC', 'سانت مارتن': 'MF',
             'سانت هيلانة': 'SH', 'سريلانكا': 'LK', 'سلوفاكيا': 'SK', 'سلوفينيا': 'SI', 'سنغافورة': 'SG',
             'سوازيلند': 'SZ', 'سورية': 'SY', 'سورينام': 'SR', 'سويسرا': 'CH', 'سيراليون': 'SL', 'سيشيل': 'SC',
             'شيلي': 'CL', 'صربيا': 'RS', 'طاجيكستان': 'TJ', 'عُمان': 'OM', 'غامبيا': 'GM', 'غانا': 'GH',
             'غرينادا': 'GD', 'غواتيمال': 'GT', 'غويانا الفرنسية': 'GF', 'غيانا': 'GY', 'غيرنزي': 'GG',
             'غينيا': 'GN', 'غينيا الاستوائي': 'GQ', 'غينيا-بيساو': 'GW', 'فانواتو': 'VU', 'فرنسا': 'FR',
             'فلسطين': 'PS', 'فنزويلا': 'VE', 'فنلندا': 'FI', 'فيتنام': 'VN', 'فيجي': 'FJ', 'قبرص': 'CY',
             'قطر': 'QA', 'قيرغيزستان': 'KG', 'كازاخستان': 'KZ', 'كاليدونيا الجديدة': 'NC', 'كاميرون': 'CM',
             'كرواتيا': 'HR', 'كمبوديا': 'KH', 'كندا': 'CA', 'كوبا': 'CU', 'كوريا الجنوبية': 'KR',
             'كوريا الشمالية': 'KP', 'كوستاريكا': 'CR', 'كولومبيا': 'CO', 'كيريباتي': 'KI', 'كينيا': 'KE',
             'لاتفيا': 'LV', 'لاوس': 'LA', 'لبنان': 'LB', 'لتوانيا': 'LT', 'لوكسمبورغ': 'LU', 'ليبيا': 'LY',
             'ليبيريا': 'LR', 'ليختنشتين': 'LI', 'ليسوتو': 'LS', 'مارتينيك': 'MQ', 'ماكاو': 'MO', 'مالاوي': 'MW',
             'مالطا': 'MT', 'مالي': 'ML', 'ماليزيا': 'MY', 'مايوت': 'YT', 'مدغشقر': 'MG', 'مصر': 'EG',
             'مقدونيا': 'MK', 'منغوليا': 'MN', 'موريتانيا': 'MR', 'موريشيوس': 'MU', 'موزمبيق': 'MZ',
             'مولدافيا': 'MD', 'موناكو': 'MC', 'مونتسيرات': 'MS', 'ميانمار': 'MM', 'ميكرونيسيا': 'FM',
             'ناميبيا': 'NA', 'ناورو': 'NR', 'نيبال': 'NP', 'نيجيريا': 'NG', 'نيكاراجوا': 'NI', 'نيوزيلندا': 'NZ',
             'نييوي': 'NU', 'هايتي': 'HT', 'هندوراس': 'HN', 'هنغاريا': 'HU', 'هولندا': 'NL', 'هونغ كونغ': 'HK'}
star = mongo.db.false_keywords
for s in star.find():
    word = s['keyword']
    freq = s['frequency']

    output.append({'mal': str(next(iter(countries)))})

    # if word in countries:
    #     output.append({'word': word,
    #                    'count': next(iter(countries))})
    # else:
    #     output.append({'word': word,
    #                    'mal': next(iter(countries))})
    #     # output.append({#'country': countries[word],
    #     #                'frequency': freq})
return jsonify(output)

被注释的部分不起作用(我意识到这没有任何意义,但是我只是添加和删除了部分代码以检测发生了什么),因此要对其进行测试,在未注释的部分中,我只是返回了字典中的第一个键。 当我在计算机上本地运行时,得到的结果是:

[
  {
"mal": "\u0625\u064a\u0631\u0627\u0646"
  }, 
]

但是,当我将其部署到heroku并想转到分配的url时,结果如下:

[{"mal":"\u0627\u0644\u0645\u0627\u0644\u062f\u064a\u0641"}]

显然,对于本质上相同的代码而言,这些值是不同的,我意识到这是与数据库中的值进行比较时导致问题的原因。 我不知道是什么导致了Heroku和本地主机之间的这种差异。 我希望在本地主机上返回的值也要在heroku服务器上返回。 提前致谢。

注意:我已经在Flask应用的顶部声明了编码,如下所示:

# -*- coding: utf-8 -*-

并已使用以下命令将heroku的默认编码更改为utf-8:

heroku config:add LANG=en_US.UTF-8

另外,如果您不想复制字典,我要打印的字符串是“إيران”,而对应的UTF-8值是“ \\ u0625 \\ u064a \\ u0631 \\ u0627 \\ u0646”

python heroku flask utf-8 arabic
© www.soinside.com 2019 - 2024. All rights reserved.