- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在使用 Python 3.3 cx_Oracle 5.1.2 和“NLS_LANG”环境变量显示来自“ENGLISH_UNITED KINGDOM.US7ASCII”Oracle 11 数据库的国家字符时遇到问题。db 表列类型为“VARCHAR2(2000 BYTE)”
如何在 Python 中显示来自 Oracle US7ASCII 的字符串“£aÀÁÂÃÄÅÆÇÈ”?这将是某种黑客攻击。hank 适用于所有其他脚本语言 Perl、PHP、PL/SQL 和 Python 2.7,但不适用于 Python 3.3。
在 Oracle 11 数据库中,我创建了 SECURITY_HINTS.ANSWER="£aÀÁÂÃÄÅÆÇÈ"。 ANSWER 列类型是“VARCHAR2(2000 BYTE)”。
现在,当使用 cx_Oracle 和默认的 NLS_LANG 时,我得到“¿a¿
当使用 NLS_LANG="ENGLISH_UNITED KINGDOM.US7ASCII"我得到
"UnicodeDecodeError: 'ascii' codec can't decode byte 0xa3 in position 0: ordinal not in range(128)"
更新1我取得了一些进步。当切换到 Python 2.7 和 Python 2.7 的 cx_Oracle 5.1.2 时,问题就消失了(我从 db 得到了所有 >127 个字符)。在 Python 2 中,字符串表示为字节,在 Python 3+ 中,字符串表示为 unicode。我仍然需要 Python 3.3 的最佳解决方案。
更新2该问题的一种可能解决方案是使用 rawtohex(utl_raw.cast_to_raw 参见下面的代码。
cursor.execute("select rawtohex(utl_raw.cast_to_raw(ANSWER)) from security_hints where userid = '...'")
for rawValue in cursor:
print (''.join(['%c' % iterating_var for iterating_var in binascii.unhexlify(rawValue[0])]))
我脚本的源代码在下面或在 GitHub和 GitHub Sollution
def test_nls(nls_lang=None):
print (">>> run test_nls for %s" %(nls_lang))
if nls_lang:
os.environ["NLS_LANG"] = nls_lang
os.environ["ORA_NCHAR_LITERAL_REPLACE"] = "TRUE"
connection = get_connection()
cursor = connection.cursor()
print("version=%s\nencoding=%s\tnencoding=%s\tmaxBytesPerCharacter=%s" %(connection.version, connection.encoding,
connection.nencoding, connection.maxBytesPerCharacter))
cursor.execute("SELECT USERENV ('language') FROM DUAL")
for result in cursor:
print("%s" %(result))
cursor.execute("select ANSWER from SECURITY_HINTS where USERID = '...'")
for rawValue in cursor:
print("query returned [%s]" % (rawValue))
answer = rawValue[0]
str = ""
for iterating_var in answer:
str = ("%s [%d]" % (str, ord(iterating_var)))
print ("str %s" %(str))
cursor.close()
connection.close()
if __name__ == '__main__':
test_nls()
test_nls(".AL32UTF8")
test_nls("ENGLISH_UNITED KINGDOM.US7ASCII")
查看下面的日志输出。
run test_nls for None
version=11.1.0.7.0
encoding=WINDOWS-1252 nencoding=WINDOWS-1252 maxBytesPerCharacter=1
ENGLISH_UNITED KINGDOM.US7ASCII
query returned [¿a¿¿¿¿¿¿¿¿¿]
str [191] [97] [191] [191] [191] [191] [191] [191] [191] [191] [191
run test_nls for .AL32UTF8
version=11.1.0.7.0
encoding=UTF-8 nencoding=UTF-8 maxBytesPerCharacter=4
AMERICAN_AMERICA.US7ASCII
query returned [�a���������]
str [65533] [97] [65533] [65533] [65533] [65533] [65533] [65533] [65533] [65533] [65533]
run test_nls for ENGLISH_UNITED KINGDOM.US7ASCII
version=11.1.0.7.0
encoding=US-ASCII nencoding=US-ASCII maxBytesPerCharacter=1
ENGLISH_UNITED KINGDOM.US7ASCII
Traceback (most recent call last):
File "C:/dev/tmp/Python_US7ASCII_cx_Oracle/showUS7ASCII.py", line 71, in <module>
test_nls("ENGLISH_UNITED KINGDOM.US7ASCII")
File "C:/dev/tmp/Python_US7ASCII_cx_Oracle/showUS7ASCII.py", line 55, in test_nls
for rawValue in cursor:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa3 in position 0: ordinal not in range(128)
我试图在 Django 网页中显示它。但是每个字符都是带有代码 191 或 65533 的字符。
我看过 choosing NLS_LANG for Oracle和 Importing from Oracle using the correct encoding with Python
最佳答案
如果你想在客户端应用程序中得到不变的ASCII 字符串,最好的方法是从数据库中以二进制方式传输它。因此,第一次转换必须借助 UTL_RAW
在服务器端关闭封装与标准rawtohex
功能。
您在 cursor.execute
中的选择可能如下所示:
select rawtohex(utl_raw.cast_to_raw(ANSWER)) from SECURITY_HINTS where USERID = '...'
在客户端上,您得到了一串十六进制字符,可以借助 binascii.unhexlify
将其转换为字符串表示形式。功能:
for rawValue in cursor:
print("query returned [%s]" % (binascii.unhexlify(rawValue)))
附言我不懂 Python
语言,所以最后的陈述可能不正确。
关于python - 如何使用 Python cx_Oracle 从 US7ASCII Oracle 中读取国家字符(>127)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21336211/
我正在尝试将时间戳转换为各个时区的本地时间,并发现某些 TimeZone 在 Chrome(v76.0.38)中不支持,但在 Mozilla(v68.0.2)中工作正常。 let d = new
我有一个 shell 脚本(准确地说是 zsh),它使用 strftime "%I:%M %p %Z (%a, %b %d)" "$EPOCHSECONDS" 生成“当前时间”,例如 “02:45 P
例如,在基于 Bootstrap 的应用程序中,我可能会编写标记以使网格为大屏幕宽 8 列,小屏幕宽 2 列。 屏幕尺寸肯定会对屏幕设计产生影响,在我开始在 famo.us 中尝试之前,我想知道应该遵
我对 Famo.us 所呈现的“这是碎片,现在去做点什么”的方式没有意见,但如果能对我希望如何设置我的项目、结构、模块等有一些指导,那就太好了. 为什么没有实际网页的演示,而不是单屏 iPhone V
Famo.us Surfaces 有一个单一的方法来设置一个表面的大小。它们有一个“大小”属性,该属性采用 2 个数字组成的数组,这些数字直接对应于像素值。考虑到大量不同的屏幕尺寸,这在处理移动设备时
我在使用 Famo.us scrollview 的移动设备上遇到滚动性能不佳的问题。我正在使用 Famo.us/Angular。这是使用的代码:
创建 InputSurface 时,我无法使用各种属性,例如 autofocus 或 maxLength。 this.email = new InputSurface({ classe
有没有办法在现有的 DOM 结构中创建 famo.us 容器? 我的意思是创建一个 famo.us 上下文和生成的 .famous-container (?),并将其附加到现有元素。 最佳答案 当然。
我见过一些例子,人们在 famo.us 中对 Surface 类进行子类化,并重写 deploy 函数。这是 famo.us 在渲染上需要的特殊函数吗?我有一个我正在构建的“控件”,它有一些我想在它变
AFAIK,目前没有像 jsfiddle 或 codepen 这样的网站支持 Famo.us。是否有其他方法可以共享 Famo.us 的工作代码示例,这些示例足够永久以保证在 Stack Overfl
相关 this question about scrollview我对相反的感兴趣 - 如何从代码控制滚动并添加滚动条。只是想知道 famo.us 是否有任何预设方法可以做到这一点,或者我们是否必须手
这个问题在这里已经有了答案: How to remove the space between inline/inline-block elements? (41 个回答) 关闭 3 年前。
我从 the PocketSphinx tutorial 中读取了以下代码 config = cmd_ln_init(NULL, ps_args(), TRUE, "-hmm
考虑以下代码: public class ReadingTest { public void readAndPrint(String usingEncoding) throws Excepti
ISO 3166有一个包含 2 个字符的列表 country codes如 美国 , 英国 , FR . 我用过的购物车既有这些代码,也有文化代码,例如 zh-CN 或 en-UK . 对于一个单独的
我正在运行 Eclipse 并尝试创建一个简单的测试程序来尝试我们的 ResourceBundle 和几个不同的文件。该文件正确命名为 ResourceFile_us_US.properties。但是
我是山姆的新手。 我正在运行 aws-cli/2.1.37 Python/3.8.8 Darwin/19.6.0 exe/x86_64提示/关闭 SAM CLI,版本 1.29.0 请参阅下面的 te
我有一个旧数据库,时区格式如下: US/Eastern Australia/Melbourne 在我的新 Rails 应用程序中,我将它们保存为: Eastern Time (US & Canada)
如果你有国家代码US、FR(ISO-3166-1 alpha-2国家代码),你如何获得Locale代码( Locale.US, Locale.FRANCE) 来做这样的事情: System.out.p
我想上传一个文件到 amazon CLI 但它不工作 当我手动上传时它工作正常 我正在使用下面的命令 aws s3 cp /localfolderlocation awss3foldername --
我是一名优秀的程序员,十分优秀!