一个可以提取汉字的函数

Oracle 中提取汉字数据去除非汉字数据 --提取汉字,去掉非汉子数据 --创建函数 /*使用ASCII码来区分中文和其它字符,中文的ASCII码值的范围是45217~63486, 根据这个来实现,我们就需要使用ORACLE中的函数ASCII,用它来返回ASCII值。*/create or replace function FUNC_CHINESE(custName varchar2) return varchar2 is   Resu... 阅读详情

一个可以提取汉字的函数  

此函数引自itpub,原文http://www.itpub.net/847680.html

该函数只适用于 数据库字符集是 ZHS16GBK的,且只提取 6763个简体汉字,也就是一二级汉字
但是实际上编码的判断适用于 GB18030, ZHS16GBK, ZHS16CGB231280, GB 13000.1/ISO 10646.1
等标准,这些标准对于简体汉字的编码都是一样的

写一函数,准确地判断字段是否含有汉字或者提取汉字等
从表里提取汉字, 需要考虑字符集, 不同的字符集汉字的编码有所不同
这里以GB2312为例, 写一函数准确地从表里提取简体汉字.

假设数据库字符集编码是GB2312, 环境变量(注册表或其它)的字符集也是GB2312编码
并且保存到表里的汉字也都是GB2312编码的

那么也就是汉字是双字节的,且简体汉字的编码范围是
B0A1 - F7FE
换算成10进制就是
B0 A1 F7 FE
176,161 - 247,254

我们先看一下asciistr函数的定义
Non-ASCII characters are converted to the form xxxx, where xxxx represents a UTF-16 code unit.
但是这并不表示以 "" 开始的字符就是汉字了

举例如下
SQL> select * from test;

NAME
--------------------
,啊OO10哈
你好aa
大家好aa/
☆大海123
★ABC

这里第5条记录有一个实心的五角星
然后用asciistr函数转换一下试试
SQL> select name,asciistr(name) from test;

NAME ASCIISTR(NAME)
-------------------- ----------------------
,啊OO10哈 ,554AOO1054C8
你好aa 4F60597Daa
大家好aa/ 59275BB6597Daa/
☆大海123 260659276D77123
★ABC 2605ABC

我们看到最后一条记录的实心五角星也是 ""开头的
此时我们就不能用asciistr(字段)是否存在 "" 来判断是否含有汉字了.

我的函数如下,基本思路是判断字符的编码是否在GB2312规定的汉字编码范围之内


代码:--------------------------------------------------------------------------------
create or replace function get_chinese(p_name in varchar2) return varchar2
as
v_code varchar2(30000) := '';
v_chinese varchar2(4000) := '';
v_comma pls_integer;
v_code_q pls_integer;
v_code_w pls_integer;
begin
if p_name is not null then
select replace(substrb(dump(p_name,1010),instrb(dump(p_name,1010),'ZHS16GBK:')),'ZHS16GBK: ','') into v_code from dual where rownum=1;
for i in 1..length(p_name) loop
if lengthb(substr(p_name,i,1))=2 then
v_comma := instrb(v_code,',');
v_code_q := to_number(substrb(v_code,1,v_comma-1));
v_code_w := to_number(substrb(v_code,v_comma+1,abs(instrb(v_code,',',1,2)-v_comma-1)));
if v_code_q>=176 and v_code_q<=247 and v_code_w>=161 and v_code_w<=254 then
v_chinese := v_chinese||substr(p_name,i,1);
end if;
v_code := ltrim(v_code,'1234567890');
v_code := ltrim(v_code,',');
end if;
v_code := ltrim(v_code,'1234567890');
v_code := ltrim(v_code,',');
end loop;
return v_chinese;
else
return '';
end if;
end;
/
.--------------------------------------------------------------------------------


好,现在来执行一些语句
SQL> select * from test;

NAME
--------------------
,啊OO10哈
你好aa
大家好aa/
☆大海123
★ABC

5 rows selected.

1. 列出有汉字的记录
SQL> select name from test where length(get_chinese(name))>0;

NAME
--------------------
,啊OO10哈
你好aa
大家好aa/
☆大海123

4 rows selected.

2. 列出有汉字的记录,并且只列出汉字

SQL> select get_chinese(name) from test where length(get_chinese(name))>0;

GET_CHINESE(NAME)
---------------------------------------------------------------------------
啊哈
你好
大家好
大海

4 rows selected.


需要说明的是GB2312共有6763个汉字,即72*94-5=6763
我这里是计算72*94,没有减去那5个,那五个是空的。等查到了再减去
============

改写这个函数,可以提取非汉字或者汉字
该函数有两个参数,第一个表示要提取的字符串,第二个是1,表示提取汉字,是非1,表示提取非汉字


代码:--------------------------------------------------------------------------------
create or replace function get_chinese
(
p_name in varchar2,
p_chinese in varchar2
) return varchar2
as
v_code varchar2(30000) := '';
v_chinese varchar2(4000) := '';
v_non_chinese varchar2(4000) := '';
v_comma pls_integer;
v_code_q pls_integer;
v_code_w pls_integer;
begin
if p_name is not null then
select replace(substrb(dump(p_name,1010),instrb(dump(p_name,1010),'ZHS16GBK:')),'ZHS16GBK: ','') into v_code from dual where rownum=1;
for i in 1..length(p_name) loop
if lengthb(substr(p_name,i,1))=2 then
v_comma := instrb(v_code,',');
v_code_q := to_number(substrb(v_code,1,v_comma-1));
v_code_w := to_number(substrb(v_code,v_comma+1,abs(instrb(v_code,',',1,2)-v_comma-1)));
if v_code_q>=176 and v_code_q<=247 and v_code_w>=161 and v_code_w<=254 then
v_chinese := v_chinese||substr(p_name,i,1);
else
v_non_chinese := v_non_chinese||substr(p_name,i,1);
end if;
v_code := ltrim(v_code,'1234567890');
v_code := ltrim(v_code,',');
else
v_non_chinese := v_non_chinese||substr(p_name,i,1);
end if;
v_code := ltrim(v_code,'1234567890');
v_code := ltrim(v_code,',');
end loop;
if p_chinese = '1' then
return v_chinese;
else
return v_non_chinese;
end if;
else
return '';
end if;
end;
/

.--------------------------------------------------------------------------------

SQL> select * from a;

NAME
--------------------
我们啊、
他(艾呀)是★们
他的啊@

SQL> select get_chinese(name,1) from a;

GET_CHINESE(NAME,1)
-----------------------------------------
我们啊
他艾呀是们
他的啊

SQL> select get_chinese(name,0) from a;

GET_CHINESE(NAME,0)
-----------------------------------------
、
()★
@

SQL>

 

简体汉字的编码范围是
B0A1 - F7FE
参考这个连接
http://www.knowsky.com/resource/gb2312tbl.htm
http://219.136.187.225/SchoolWeb/hz.../HAIZI/GBK2.htm
如果想研究unicode,可以去官方网站
www.unicode.org
另外,windows自带的造字程序里面就有一个编码表。


不过好像也可以处理UTF8的,通过上个帖子可以看出来(返回汉字拼音首字母的问题)。

手把手教你用Verilog在FPGA上驱动0.96寸OLED(I2C协议,含完整代码和字库) 本文详细介绍了如何使用Verilog在FPGA上通过I2C协议驱动0.96寸OLED显示屏,包含完整的硬件连接指南、I2C协议解析、Verilog代码实现及字库设计。从初始化序列到字符显示引擎,提供可立即上手的解决方案,适合嵌入式系统开发者快速实现OLED显示功能。 阅读详情

相关推荐

修复ASUS in WinRE教程

暑假入手了天选三,发现是win11家庭版,本来想着家庭版将就一下无所谓,结果在使用的过程中发现相较于专业版真的是不能比,于是自己就重装了系统,发现ASUS in WinRE入口不见了,折腾半天最后成功修复。

weixin_46202629的博客 1万+

准确地判断字段是否含有汉字或者提取汉字等

写一函数,准确地判断字段是否含有汉字或者提取汉字等 从表里提取汉字, 需要考虑字符集, 不同的字符集汉字的编码有所不同这里以GB2312为例, 写一函数准确地从表里提取简体汉字.假设数据库字符集编码是GB2312, 环境变量(注...

csdown1001的博客 379

新手避坑指南:HT7036计量芯片SPI读取电压的完整流程(从复位到校准)

本文详细介绍了HT7036计量芯片的SPI读取电压完整流程,从硬件准备到校准设置,重点解析了复位引脚处理、SPI通信配置、芯片初始化及数据处理等关键步骤。针对常见问题如晶振焊接、SPI时序错误等提供实用解决方案,帮助开发者高效完成电压测量与校准。

weixin_30070339的博客 326

提取汉字的函数(SQL Server)

----如果该对象已存在则先删除 if object_id('fnExtractChinese') is not null drop function fnExtractChinese GO ----创建字符串提取函数 create function fnExtractChinese(@string varchar(100)) returns varchar(100) ...

weixin_30399155的博客 840

数据库迁移策略实战:MySQL到PostgreSQL

数据库迁移是一项复杂且细致的任务,需要充分的准备工作、合适的迁移策略和严格的验证与优化步骤。通过选择合适的迁移工具、进行手动迁移和应用程序适配、以及迁移后的验证与优化,可以确保数据迁移的成功和业务的连续性。希望本文的分享能够为大家在MySQL到PostgreSQL的数据库迁移实战中提供一些有用的参考和启示。

shejizuopin的博客 1731

Tomcat启动过程中cmd窗口(控制台)中文乱码的问题

tomcat启动时,启动过程日志中文乱码的处理方法。

寻码启示 1942

Oracle 获取字符串中所有中文汉字(不含标点符号)

CREATE OR REPLACE Function F_GetCHT(Str Varchar2) Return Varchar2 Is I Int; Sub_Str Varchar2(500); Str2 Varchar2(500); Str1 Varchar2(500); Str3 Varchar2(500); Len Int; B

lijuntao0324的专栏 2641

8-阿里云服务器 ECS配置R及Studio Server

步骤概览:(首先要明确自己的系统然后进行安装)

hx2024的博客 1570

只返回汉字的函数

<br />create or replace function get_chinese(p_name in varchar2) return varchar2<br />as<br />  v_code     varchar2(30000) := '';<br />  v_chinese  varchar2(4000)  := '';<br />  v_comma    pls_integer;<br />  v_code_q   pls_integer;<br />  v_code_w   pls_i

zftang的专栏 1105

工业视觉实战:用摄像头+AI高精度测量钢板尺寸(附深度分析)

摘要: 钢铁制造业正加速采用基于摄像头与深度学习的视觉测量技术,以取代传统人工测量,实现钢板长、宽、高(厚)的非接触、高精度在线检测。核心方案包括单目视觉(低成本但受限于变形)、双目/多目立体视觉(可精确测量变形钢板)及3D激光扫描(微米级精度)。系统精度受硬件(相机分辨率、镜头)、算法(亚像素技术)及环境稳定性共同影响,综合精度可达±0.1mm。实战中需重点解决热膨胀(需红外测温实时补偿)和钢板变形(必须采用三维方案)两大挑战,并通过工程化设计(散热、防振)确保系统可靠运行。该技术需融合光学、机械与算法,

数字人生 391

COSMO-RS理论:流体相热力学预测的核心模型与技术突破

摘要:COSMO-RS模型通过量子化学计算分子表面电荷分布,实现了从微观量子尺度到宏观化工过程的热力学预测。该模型基于介电连续介质理论,将分子表面片段化处理,通过σ-剖面描述电荷分布,并计算片段间的静电失配能和氢键能。其核心算法通过自洽化学势方程求解活度系数,克服了传统模型依赖实验参数的局限。随着技术进步,模型引入了高阶描述符和色散力修正,提升了预测精度。在药物研发、化工分离等领域广泛应用,但仍存在对长程有序结构预测不足等局限性。该模型为复杂体系的热力学性质预测提供了重要理论工具。

ASKCOS博客 973

写一个提取单元格内中文汉字的函数office365和wps最新版有效

=CONCAT(IF((UNICODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>=19968)*(UNICODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))

u010101507的博客 609

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ORACLE写一函数,准确地判断字段是否含有汉字或者提取汉字等

从表里提取汉字, 需要考虑字符集, 不同的字符集汉字的编码有所不同这里以GB2312为例, 写一函数准确地从表里提取简体汉字.假设数据库字符集编码是GB2312, 环境变量(注册表或其它)的字符集也是GB2312编码并且保存到表里的汉字也都是GB2312编码的那么也就是汉字是双字节的,且简体汉字的编码范围是B0A1 - F7FE换算成10进制就是B0  A1    F7  FE176,161 -

ATGC的专栏 4530

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

oracle直截取汉字,ORACLE_从字符串中提取汉字(不包括全角符及日文韩文等字符) | 学步园...

转载自:http://blog.youkuaiyun.com/atgc/article/details/2036799感谢网友ATGC ,这个问题研究了一天,终于搞定!!从表里提取汉字, 需要考虑字符集, 不同的字符集汉字的编码有所不同这里以GB2312为例, 写一函数准确地从表里提取简体汉字.假设数据库字符集编码是GB2312, 环境变量(注册表或其它)的字符集也是GB2312编码并且保存到表里的汉字也都是...

weixin_36448083的博客 2779

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

获取字符串中的汉字

获取字符串中的汉字 实例如图: (1)新建一个基于对话框的应用程序。 (2)向对话框添加ID属性为IDC_R和IDC_S的编辑框。 (3)方法OnButton1是“获取”按钮的单击事件的实现,完成指定编辑框的汉字的提取,代码如下: void CCgetcharsDlg::OnButton1() { // TODO: Add your control notification handler code here CString T, P,S ; GetDlgItem(IDC_R)->GetWind

MYNAMEZJK的博客 740

基于学习手写汉字特征的简易汉字识别程序-MATLAB(一)

这是我在网上找到的一个手写汉字识别的程序,刚开始的时候什么也不懂,然后通过自己的学习,开始对程序有了一些了解和见解,毕竟看懂程序是写程序的第一步,下面是我对这些程序的一些感悟,写给和自己志同道合的人看。 第一: 学习函数,有函数名字就可以看出来,这是一个学习函数,主要用于学习手写汉字的特征。 function studyData() %自动化学习所有训练样本集 %通过循环对每一个学习样本调用学习函...

wuxulong123的博客 6304

准确地判断字段是否含有汉字或者提取汉字

转自:atgc的博客http://atgc.itpub.net/category/22412/38862 写一函数,准确地判断字段是否含有汉字或者提取汉字等 从表里提取汉字, 需要考虑字符集, 不同的字符集汉字的编码有所不同这里以GB2312为例, 写一函数准确地从表里提取简体汉字.假设数据库字符集编码是GB2312, 环境变量(注册表或其它)的字符集也是GB231

FALENT的专栏 861

SQL SERVER 提取字符串中汉字

        对一个字符串进行提取,获取其中汉字部分,方法如下:IF OBJECT_ID('DBO.GET_ZNSTR') IS NOT NULL DROP FUNCTION DBO.GET_ZNSTR GO CREATE FUNCTION DBO.GET_ZNSTR(@S NVARCHAR(100)) RETURNS VARCHAR(100) AS BEGIN WHILE PATINDEX('...

二月十六的博客 1万+

asp 提取字符串中的汉字

<br /><%<br />Function GetChineseStrByLength(str,length)<br />    If IsNull(str) Or str = "" Then<br />        s = ""<br />    Else<br />        Dim i, n, k, chrA,s<br />        k = 0<br />        n = Len(str)<br />        For i = 1 To n<br />            c

长江的专栏 834

excel汉字拼音首字母的提取方法和完整代码介绍

关于excel汉字拼音首字母提取的自定义函数,在网上看了一些代码,总有点小遗憾,一些自定义来提取汉字拼音首字母,如果数据源里面有字母或者数字将会被忽略掉。   下面这个excel汉字拼音首字母提取的自定义函数,相对完美一些,做了容错处理,考虑到了如果是数字或者字母,将会自动显示出来,如果是汉字才进行提取拼音首字母。 [img]http://dl2.iteye.com/upload/...

jzgl_cadn的专栏 2189

delphi 提取字符串中的汉字

<br />原理 :在windows中,中文和全角字符都占两个字节,<br />并且使用了ascii chart 2 (codes 128 - 255 )。<br />全角字符的第一个字节总是被置为163,<br />而第二个字节则是相同半角字符码加上128(不包括空格)。<br />如半角a为65,则全角a则是163(第一个字节)、 193 (第二个字节, 128 + 65 )。<br />而对于中文来讲,它的第一个字节被置为大于163,(<br />如 ' 阿 ' 为: 176   162 ),我们可以

文图软件 4550

PowerBuilder中取汉字串首字符的一个函数

 今天看到xuejun的一个取汉字首字符的函数,试用了一下,感觉很好用,不敢独享,拿出来跟大家分享:$PBExportHeader$uf_getfirstletter.srf$PBExportComments$ 返回给定汉字串的首字母串,  xuejun , 19990821global type uf_getfirstletter from function_objectend type

三十而立 四十不惑 1163

汉字的正则表达式_Excel提取数字、字母、汉字一个公式搞定

小伙伴们大家好,今天给大家介绍一个自定义函数,可以用来提取文本中的数字、汉字和字母,话不多说,让我们一起看下效果。功能讲解上图中,通过自定义一个函数“tiqu”,它一共有两个参数:tiqu(字符串,提取类型)参数一是需要提取的字符串;参数二是需要提取的类型,1代表提取字母,2代表提取数字,3代表提取汉字。代码讲解首先通过一个IF函数,来判断自定义函数参数二的输入情况:如果参数二输入为1,则正则表达...

weixin_32299949的博客 2009

js正则表达式提取汉字和去掉汉字

//只提取汉字   function GetChinese(strValue) {       if(strValue!= null && strValue!= ""){           var reg = /[\u4e00-\u9fa5]/g;            return strValue.match(reg).join("");       }

书写人生 3万+
上一篇: 字符集问题的初步探讨
下一篇: SQLSERVER中实现返回汉字笔画数的函数
suncrafted
博客等级 码龄24年 103粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值