|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
你看出了作者的深度?深处半米!当初是冲那么多的大牛给他写序才买的,后来才发现无啥内容,作者也只是才用几年的新手,百花了几十两银子,再次感叹当今社会的虚伪与浮躁创立
良多言语,包含英语在内,都利用沉音字符(accentedcharacter)。由于这些字符不属于ASCII字符集,以是假如不检察Unicode值也不利用Unicode编纂器并将其转成一个已知字符集,就很难编写利用这些字符的代码。
Oracle9i引进了COMPOSE函数,该函数承受一串Unicode字符并划定规矩化其文本。这就意味着它能够承受一个字母和一个组合标志,好比说‘a(Unicode字符0097)和沉音符(Unicode字符0300),然后创立一个独自的由两个标志组合而成的字符。COMPOSE利用特别的组合标志,而没有利用ASCII中响应的音节标志,它所利用的特别的组合标志是Unicode尺度的一部分。下面的例子的了局应当是Unicode字符00E0(有一个沉音符的小写拉丁字母‘a)。
在ANSI中最多见的组合字符有:
·U+0300:沉音符(graveaccent)(`)
·U+0301:重音符(acuteaccent)()
·U+0302:顿挫音标记(circumflexaccent)(^)
·U+0303:颚化标记(tilde)(~)
·U+0308:元音变音
假如没有特别的软件大概键盘驱动程序的话,很难在键盘上输出Unicode字符0097和0300。因而,以纯ASCII文本输出Unicode序列的一个办法是利用UNISTR函数。这个函数承受一个ASCII字符串然后以国度字符集(一般作为16位Unicode大概UTF-8字符集安装)创立一个Unicode字符的序列。它利用十六进制占位符序列映照任何非ASCII字符,映照体例与Java相似。
要输出a后接一个沉音符组合字符的序列,可使用UNISTR(‘a 300),而不要试图间接在代码中输出字符。这个函数在任何字符集和任何具有基于Unicode的国度字符集的数据库下都能够一般运转。能够将多个组合字符放在函数中——能够在UNISTR函数中夹杂利用ASCII和Unicode占位符。比方,能够像上面如许利用UNISTR函数:
selectCOMPOSE(UNISTR(Unlessyouarenai 308ve,meetmeatthecafe 301with
yourre 301sume 301.))fromdual;
在将UNISTR函数的输入与COMPOSE组应时,能够在不查找任何值的情形下天生一个Unicode字符。比方:
selectitistrueifcompose(unistr(a 300))=unistr( 0e0);
COMPOSE函数前往一个NVARCHAR2字符串,前往的NVARCHAR2字符勾通常是基于Unicode的。假如是在当地利用这些字符,在了局中具有一个隐式地TO_CHAR时,数据库将实验将Unicode字符映照到当地字符集。不是一切的字符都能够被映照,有一些字符组合在COMPOSE中不克不及事情,由于Unicode协会没有在Oracle所用的级别界说它们。
要疾速地反省字符怎样在一个特定的情况下查询,能够运转一个与上面的剧本相似的剧本,以检察在输入组合字符怎样被映照。你大概必要断定一下NLS_LANG设置以确保这些字符准确地前往:
createorreplacetypehexrange_tblastableofvarchar2(4);
/
showerrors;
createorreplacefunctionhexrange(n1varchar2,n2varchar2)
returnhexrange_tblpipelined
is
begin
foriinto_number(n1,000X)..to_number(n2,000X)loop
piperow(to_char(i,FM000X));
endloop;
return;
endhexrange;
/
showerrors;
selectcolumn_valuecomposer,
compose(unistr(a||column_value))a,
compose(unistr(c||column_value))c,
compose(unistr(e||column_value))e,
compose(unistr(i||column_value))i,
compose(unistr(n||column_value))n,
compose(unistr(o||column_value))o,
compose(unistr(r||column_value))r,
compose(unistr(s||column_value))s,
compose(unistr(u||column_value))u,
compose(unistr(y||column_value))y
fromtable(hexrange(0300,0327))x;
上面放松一下,这里有一小段PL/SQL剧本,这段剧本利用COMPOSE和UNISTR创立一种特别效果,良多SMS用户、黑客和渣滓邮件发送者都利用这类效果使可读英文文本难于扫描,由于它利用字符重音版本的一个随机序列。我利用DBMS_RANDOM随机拔取一个可由分歧字符利用的组合字符,然后让SQL举行组兼并举行反向转换以天生ANSI/Latin-1输入。这段剧本在代码中利用了EMP表的ENAME字段。
setserveroutputon;
declare
--thesecombinationsworkunderANSI,atleast
a_combnvarchar2(50):=unistr( 300 301 302 303 308 30A);
c_combnvarchar2(50):=unistr( 327);
e_combnvarchar2(50):=unistr( 300 301 302 308);
i_combnvarchar2(50):=unistr( 300 301 308);
n_combnvarchar2(50):=unistr( 303);
o_combnvarchar2(50):=unistr( 300 301 302 303 308);
u_combnvarchar2(50):=unistr( 300 301 302 308);
y_combnvarchar2(50):=unistr( 301 308);
l_idxinteger;
l_enamenvarchar2(50);
chnchar;
l_junkvarchar2(50);
begin
dbms_random.initialize(to_char(sysdate,SSSSS));
forrowin(selectenamefromemp)loop
l_ename:=row.ename;
l_junk:=null;
foriin1..length(l_ename)loop
ch:=substr(l_ename,i,1);
caselower(ch)
whenathen
l_junk:=l_junk||compose(ch||substr(a_comb,
mod(abs(dbms_random.random),length(a_comb))+1,1));
whencthen
l_junk:=l_junk||compose(ch||substr(c_comb,
mod(abs(dbms_random.random),length(c_comb))+1,1));
whenethen
l_junk:=l_junk||compose(ch||substr(e_comb,
mod(abs(dbms_random.random),length(e_comb))+1,1));
whenithen
l_junk:=l_junk||compose(ch||substr(i_comb,
mod(abs(dbms_random.random),length(i_comb))+1,1));
whennthen
l_junk:=l_junk||compose(ch||substr(n_comb,
mod(abs(dbms_random.random),length(n_comb))+1,1));
whenothen
l_junk:=l_junk||compose(ch||substr(o_comb,
mod(abs(dbms_random.random),length(o_comb))+1,1));
whenuthen
l_junk:=l_junk||compose(ch||substr(u_comb,
mod(abs(dbms_random.random),length(u_comb))+1,1));
whenythen
l_junk:=l_junk||compose(ch||substr(y_comb,
mod(abs(dbms_random.random),length(y_comb))+1,1));
else
l_junk:=l_junk||ch;
endcase;
endloop;
dbms_output.put_line(to_char(l_junk));
endloop;
end;
/
showerrors;
恢复到之前的某个状态,是需要数据的。这数据可以是a)回滚步骤或者b)操作之前的数据状态原文。 |
|