我们遇到的问题是文本以某种不同的方式编码,但保存在表格的单个列中.很长的故事.在MySQL上,我可以"从表中选择十六进制(str)",然后我看到字符串的字节与我设置它们完全相同.
在Oracle上,我有一个以土耳其字符İ开头的字符串,它是Unicode字符0x0130"带有上面点的拉丁文大写字母".这是我的Unicode 2.0版书的印刷版.在UTF-8中,该字符为0xc4b0.
我们需要支持非常旧的客户端应用程序.他们会在"windows-1254"中将此文本发送给我们.我们过去只是闭上眼睛,存放它,然后再将其交还.现在我们需要Unicode,或者被赋予Unicode.
所以我有:
SQL> select id, name from table where that thing;
ID NAME
------ ------------------------
746 Ý
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为"İ"在Windows-1254中是0xdd而wondows-1252中的0xdd是"Ý".我的终端大概设置为通常的windows-1252.
但:
SQL> select id, rawtohex(name) from table where that thing;
ID RAWTOHEX(NAME)
------ ------------------------
746 C39D
Run Code Online (Sandbox Code Playgroud)
似乎没有相当于MySQL中的hex(name)函数.但我必须遗漏一些东西.我在这里错过了什么?
我的java代码必须使用我提供的utf8并保存utf8副本和windows-1252副本.java代码给了我:
bytes (utf8): c4 b0
bytes (1254): dd
Run Code Online (Sandbox Code Playgroud)
然而,当我保存它时,客户端没有得到正确的字符.当我试图查看Oracle实际存储的内容时,我会看到上面看到的垃圾.我不知道C39D的来源.有什么建议?
我们在所有应用程序中都内置了ojdbc14.jar,并且我们正在连接到一个数据库,该数据库表示它是"Oracle Database 11g企业版版本11.2.0.2.0 - 64位生产".
我们有一个旧客户端与旧版服务器应用程序通信.在土耳其,它发送文本为windows-1254.我们存储它并将其发回.
数据库中的一行名称为"İ",这是一个大写字母,顶部有一个点.在windows-1254中,这是一个0xdd字符,在UTF-8中,即0xc4b0.
如果我查看数据库,我会看到:
SQL> select dump(name, 16) from thing where other thing;
DUMP(NAME,16)
--------------------------------------------------------------------------------
Typ=1 Len=2: c3,9d
Run Code Online (Sandbox Code Playgroud)
奇怪的.正如有人在另一个问题中指出的那样......
windows-1254中的"İ"字符为0xdd.事实证明,windows-1252中的0xdd是"Ý"字符,在UTF-8中为0xc39d.因此,我们看到倾销.
我们认为我们想做的是这个,但它显然不起作用:
SQL> update thing set name = UTL_RAW.CAST_TO_VARCHAR2(UTL_RAW.CONVERT(HEXTORAW('dd'), 'CP1254', 'UTF8')) where otherthing;
update thing set name = UTL_RAW.CAST_TO_VARCHAR2(UTL_RAW.CONVERT(HEXTORAW('dd'), 'CP1254', 'UTF8')) where otherthing
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "SYS.UTL_RAW", line 327
Run Code Online (Sandbox Code Playgroud)
咦?
很多文档讨论了UTL_RAW.CONVERT,没有人展示它实际使用的一个例子.这是为什么?是否有允许的NLS字符集名称列表?我找不到一个.有什么建议?我可以找到java知道的所有编码列表,但我找不到Oracle的这个列表.
我有一个java应用程序,我用来编写必须由传统软件读取的数据.该应用程序收到UTF-8.我可以成功地将其转换为Windows-1254字节.我可以将它们翻译成windows-1252.如果我然后将它们翻译成UTF-8,我可以用以下内容将其写入数据库:
SQL> update this set name = UTL_RAW.CAST_TO_VARCHAR2(hextoraw('c39d')) where otherthing;
1 row updated.
SQL> select dump(name, 16) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Android lint 检查有关我的项目的一些内容。它似乎忽略了我提供的 lint.xml 文件,使我无法启用检查。
我在 Ubuntu 14.04 上使用 Android Studio,但我只是从命令行调用 ~/Android/Sdk/tools/lint。
我在做:
$ lint --config GF/lint.xml --html lintCheck.html GF
Scanning 7.5.0: .
Scanning 7.5.0 (Phase 2):
... (and so on) ...
Wrote HTML report to file:/home/ray/Projects/jj/lintCheck.html
Lint found 26 errors and 198 warnings
$
Run Code Online (Sandbox Code Playgroud)
该报告列出了所有未启用的检查。这是我创建的 GF/lint.xml 文件:
$ cat GF/lint.xml
<?xml version="1.0" encoding="UTF-8"?>
<lint>
<issue id="HardcodedText" severity="error" />
</lint>
$
Run Code Online (Sandbox Code Playgroud)
以下是我尝试调用 lint 的方法。在所有这些情况下,所有检查都说明如下:
RelativeOverlap
Disabled By: Project lint.xml file
Run Code Online (Sandbox Code Playgroud)
那么,它所指的项目 lint.xml 文件在哪里?我已经在 ~/Android 和我所有的项目中搜索过,这个文件没有出现在其他任何地方。
相对重叠禁用者:项目 lint.xml 文件
我尝试过的: …
System.out.println("a".matches("^[A-Za-z]+"));
System.out.println("a ".matches("^[A-Za-z]+"));
Run Code Online (Sandbox Code Playgroud)
这给了我:
true
false
Run Code Online (Sandbox Code Playgroud)
到底是什么?据我所知,"[A-Za-z]"包含"a","+"表示一个或多个,所以这似乎可以起作用,至少在这个宇宙中......
细节是:
Mac OS X 10.8.4
$ java -version
java version "1.6.0_51"
Java(TM) SE Runtime Environment (build 1.6.0_51-b11-457-11M4509)
Java HotSpot(TM) 64-Bit Server VM (build 20.51-b01-457, mixed mode)
Run Code Online (Sandbox Code Playgroud)
也许我写的perl太长了,java的正则表达式系统有点像但不是吗?不知道.
我有一行文件:
$ od -c testData.txt
0000000 6 7 7 7 1 0 \t 0 \t 1 \t L P A Y \t
0000020 F 6 3 5 P 3 B \t L P A Y 0 0 0 0
0000040 1 \t F R M \t H O U S T O N G R
0000060 O U P ( a k a C O R P O R A
0000100 T E A D V O C A T …Run Code Online (Sandbox Code Playgroud)