国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Python locale 多語言模塊和我遇到的坑

tracymac7 / 3600人閱讀

摘要:遇到的問題今天工作上遇到一個相關(guān)的問題,關(guān)于字符串格式化的。是根據(jù)計算機用戶所使用的語言,所在國家或者地區(qū),以及當(dāng)?shù)氐奈幕瘋鹘y(tǒng)所定義的一個軟件運行時的語言環(huán)境。

locale遇到的問題

今天工作上遇到一個 locale 相關(guān)的問題,關(guān)于字符串格式化的。不過讓我們先從 locale 說起。

locale 簡介 什么是locale

locale 這個單詞中文翻譯成地區(qū)或者地域,其實這個單詞包含的意義要寬泛很多。locale 是根據(jù)計算機用戶所使用的語言,所在國家或者地區(qū),以及當(dāng)?shù)氐奈幕瘋鹘y(tǒng)所定義的一個軟件運行時的語言環(huán)境。通常情況下它可以按照涉及使用習(xí)慣分為12大類:

- 語言符號及其分類(LC_CTYPE)
- 數(shù)字(LC_NUMBERIC)
- 比較習(xí)慣(LC_COLLATE)
- 時間顯示格式(LC_TIME)
- 貨幣單位(LC_MONETARY)
- 信息主要是提示信息,錯誤信息,狀態(tài)信息,標(biāo)題,標(biāo)簽,按鈕和菜單等(LC_MESSAGES)
- 行么書寫方式(LC_NAME)
- 地址書寫方式(LC_ADDRESS)
- 電話號碼書寫方式(LC_TELEPHONE)
-度量衡表達方式(LC_MEASUREMENT)
- 默認(rèn)紙張尺寸大小(LC_PAPER)
- 對locale 自身包含信息的概述(LC_IDENTIFICATION)
- 除此之外還有一個LANGUAGE參數(shù),它與LC_MESSAGES相似

比如像下面的例子里:

在“簡體中文”環(huán)境,運行date 命令,顯示的是:
2016年11月24日 星期四 22時59分26秒 CST

而在英文環(huán)境下,運行date 命令,顯示的是
Thu Nov 24 23:05:12 CST 2016

簡單來說, locale 為計算機上提供了國際化和本地化轉(zhuǎn)化的環(huán)境

locale 相關(guān)命令

在Unix下可以通過命令 locale 來查看當(dāng)前語言環(huán)境,我的Mac上的顯示如下:

?  locale
LANG=
LC_COLLATE="zh_CN.UTF-8"
LC_CTYPE="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_ALL="zh_CN.UTF-8"

locale值格式類似為: 語言_地區(qū).字符集

可以這樣來查看系統(tǒng)支持locals值

locale -a

可以用如下的方式來臨時改變shell的locale設(shè)定:

?  test git:(master) ? LC_ALL=C
?  test git:(master) ? export LC_ALL
?  test git:(master) ? locale
LANG=
LC_COLLATE="C"
LC_CTYPE="C"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL="C"

設(shè)置的時候注意以下幾點:

LANG,LC*的默認(rèn)值,是最低級別的設(shè)置,如果LC*沒有設(shè)置,則使用該值。類似于 LCALL

LCALL,它是一個宏,如果該值設(shè)置了,則該值會覆蓋所有LC*的設(shè)置值。注意,LANG的值不受該宏影響

LCALL=C 意思是去除所有本地化的設(shè)置

Python locale

python提供了 locale 這個模塊,可以用來操作locale相關(guān)數(shù)據(jù),官方文檔參見這里。
其中主要的結(jié)果方法如下

import locale

# 返回當(dāng)前環(huán)境locale categorg相關(guān)的設(shè)定,category默認(rèn)為 LC_CTYPE
# LC_CTYPE 決定字符處理函數(shù)相關(guān)行為,比如 string 函數(shù)
locale.getlocale([category])


# 嘗試判斷默認(rèn)的locale設(shè)置,并且以元組的形式返回(language code, encoding)
locale.getdefaultlocale([envvars])


# 修改locale category 的設(shè)定為 locale的值, 比如locale.setlocale(locale.LC_ALL, "C"),  C 代表去除所有本地化設(shè)置
# 如果第二個參數(shù)locale沒有提供,那么會返回category的設(shè)置
locale.setlocale(category[, locale])


# 很多程序會像下面這樣開頭,這樣做會將所有的locale設(shè)置成用戶默認(rèn)的設(shè)置(通常是環(huán)境變量LANF的值)。
# 但setlocale() 不能在所有系統(tǒng)上保證線程安全性,這點要注意
import locale
locale.setlocale(locale.LC_ALL, "")

當(dāng)在shell里啟動python repl(交互器)時,默認(rèn)的環(huán)境local設(shè)置為"C", 也就是沒有本地化設(shè)置,這時候可以通過 locale.getdefaultlocale() 來查看shell當(dāng)前環(huán)境的locale設(shè)置, 并通過 locale.setlocale(locale.LC_ALL, "") 將python解釋器的locale設(shè)置成shell環(huán)境的locale,具體事例如下:

Python 2.7.10 (default, Oct 23 2015, 19:19:21)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale

>>> locale.getlocale()
(None, None)

>>> locale.getdefaultlocale()
("zh_CN", "UTF-8")

>>> locale.setlocale(locale.LC_ALL, "")
"zh_CN.UTF-8"

>>> locale.getdefaultlocale()
("zh_CN", "UTF-8")

>>> locale.getlocale()
("zh_CN", "UTF-8")
我踩的坑 strptime 和 strftime

正所謂當(dāng)局者迷,今天當(dāng)我遇到同樣的代碼,不同的環(huán)境(shell執(zhí)行和pycharm執(zhí)行)居然有不同的執(zhí)行結(jié)果時,我百思不得其姐(嘿嘿)。
代碼片段是關(guān)于 strptime 的:

import time
time.strptime("Thu, 24 Nov 2016 07:01:59 GMT", "%a, %d %b %Y %H:%M:%S GMT")

其實呢,strptime或者strftime格式化參數(shù)里有一些是跟locale相關(guān)的,比如這里的 %a %b 等,所以在不對的 locale 環(huán)境下,格式化出現(xiàn)了錯誤。

可以參考下面的示例:

Python 2.7.10 (default, Oct 23 2015, 19:19:21)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> time.strptime("Thu, 24 Nov 2016 07:01:59 GMT", "%a, %d %b %Y %H:%M:%S GMT")
time.struct_time(tm_year=2016, tm_mon=11, tm_mday=24, tm_hour=7, tm_min=1, tm_sec=59, tm_wday=3, tm_yday=329, tm_isdst=-1)
>>> import locale
>>> locale.setlocale(locale.LC_ALL, "")
"zh_CN.UTF-8"
>>> time.strptime("Thu, 24 Nov 2016 07:01:59 GMT", "%a, %d %b %Y %H:%M:%S GMT")
Traceback (most recent call last):
  File "", line 1, in 
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 467, in _strptime_time
    return _strptime(data_string, format)[0]
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 325, in _strptime
    (data_string, format))
ValueError: time data "Thu, 24 Nov 2016 07:01:59 GMT" does not match format "%a, %d %b %Y %H:%M:%S GMT"
>>> time.strptime("2016 07:01:59", "%Y %H:%M:%S")
time.struct_time(tm_year=2016, tm_mon=1, tm_mday=1, tm_hour=7, tm_min=1, tm_sec=59, tm_wday=4, tm_yday=1, tm_isdst=-1)
>>>
阿里云oss sdk 使用遇到的問題

用阿里云oss-python-SDK上傳文件時,當(dāng)我本地locale設(shè)置成 zh_CN.UTF-8 時,就回一直出問題,原因就在于上述的 strptime, 阿里云sdk代碼片段如下:

def to_unixtime(time_string, format_string):
    with _STRPTIME_LOCK:
        return int(calendar.timegm(time.strptime(time_string, format_string)))

然而從oss服務(wù)器上獲得的timestring是這樣的: Thu, 24 Nov 2016 07:01:59 GMT, 所以在我的環(huán)境里做格式化就會出錯,所以我對代碼做了如下修改:

def to_unixtime(time_string, format_string):
    with _STRPTIME_LOCK:
        time_locale = locale.setlocale(locale.LC_TIME)
        if time_locale.find("en") != 0 and time_locale != "C":
            locale.setlocale(locale.LC_TIME, "en_US")
            unixtime = int(calendar.timegm(time.strptime(time_string, format_string)))
            locale.setlocale(locale.LC_TIME, time_locale)
        else:
            unixtime = int(calendar.timegm(time.strptime(time_string, format_string)))
        return unixtime

在調(diào)用 strptime 這個方法前增加了兼容,先檢查locale,如果不是英文類型并且不是默認(rèn)的"C"類型時,將 LC_TIME 切換成英文,執(zhí)行完 strptime 后再還原回來。

參考資料

https://docs.python.org/2/lib...

http://blog.csdn.net/Nicolase...

http://www.cnblogs.com/dolphi...

https://docs.python.org/2/lib...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/44313.html

相關(guān)文章

  • 記一次開源學(xué)習(xí)--D2Admin 人人企業(yè)版

    摘要:前言上個月月底開源組開源了使用適配人人企業(yè)版專業(yè)版的前端工程具體詳情見人人企業(yè)版適配發(fā)布。當(dāng)然,也督促自己產(chǎn)出一篇相關(guān)的文章,來記錄這次有趣的學(xué)習(xí)之旅。 Created by huqi at 2019-5-5 13:01:14 Updated by huqi at 2019-5-20 15:57:37 前言 上個月月底@D2開源組 開源了使用 D2Admin 適配 人人企業(yè)版(專業(yè)版) 的...

    notebin 評論0 收藏0
  • Python學(xué)習(xí)之路23-文本和字節(jié)序列

    摘要:字符編碼表,碼位碼元將編碼字符集中的碼位轉(zhuǎn)換成有限比特長度的整型值的序列。字符編碼方案,碼元序列化也稱為常說的序列化。每個字節(jié)里的二進制數(shù)就是字節(jié)序列。另一個情況則是壓縮字節(jié)序列的值,如或進程長度編碼等無損壓縮技術(shù)。 《流暢的Python》筆記。本篇主要講述不同編碼之間的轉(zhuǎn)換問題,比較繁雜,如果平時處理文本不多,或者語言比較單一,沒有多語言文本處理的需求,則可以略過此篇。 1. 前言 ...

    anRui 評論0 收藏0
  • 項目經(jīng)驗總結(jié)

    摘要:項目中前端開發(fā)問題經(jīng)驗總結(jié)下的安全限制問題問題描述數(shù)據(jù)看板中的數(shù)據(jù)大部分都是實時數(shù)據(jù)或前一天統(tǒng)計的歷史數(shù)據(jù),因此這邊后端考慮采用來實時和定時推送數(shù)據(jù)來保證數(shù)據(jù)的實時性和有效性。 項目中前端開發(fā)問題經(jīng)驗總結(jié) ie下websocket的安全限制問題 問題描述:數(shù)據(jù)看板中的數(shù)據(jù)大部分都是實時數(shù)據(jù)或前一天統(tǒng)計的歷史數(shù)據(jù),因此這邊后端考慮采用websocket來實時和定時推送數(shù)據(jù)來保證數(shù)據(jù)的實時...

    William_Sang 評論0 收藏0
  • 在 React 項目中使用 React-intl 實現(xiàn)多語支持

    摘要:最近在項目中添加了語言國際化的功能。項目地址是雅虎的語言國際化開源項目的一部分,通過其提供的組件和可以與綁定。你當(dāng)然可以使用的方式引用,但是,這樣有前途么創(chuàng)建配置文件這里,我們將文件命名為和,代表中文和美式英語的配置包。 showImg(https://segmentfault.com/img/bVyv1N?w=900&h=506); 最近在項目中添加了語言國際化的功能。 語言國際化,...

    Mr_zhang 評論0 收藏0
  • 如何讓一個vue項目支持多語(vue-i18n)

    摘要:引入是一個插件,主要作用就是讓項目支持國際化多語言。所以新建一個文件夾,存放所有跟多語言相關(guān)的代碼。目前包含三個文件。全局搜索發(fā)現(xiàn)一共有多個。 這兩天手頭的一個任務(wù)是給一個五六年的老項目添加多語言。這個項目龐大且復(fù)雜,早期是用jQuery實現(xiàn)的,兩年前引入Vue并逐漸用組件替換了之前的Mustache風(fēng)格模板。要添加多語言,不可避免存在很多文本替換的工作,這么龐雜的一個項目,怎么才能使...

    wuyumin 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<