JS(Unicode->GB)的精简版(仍含拼音和UrlEncode)

这篇博客介绍了如何将JavaScript中的Unicode字符转换为GB2312编码,同时提供了UrlEncode和获取汉字拼音首字母的精简算法。作者提供了一个18k的js文件qswhGB2312.js,适用于常见汉字的转换。示例代码展示了转换函数的使用方法。
部署运行你感兴趣的模型镜像

http://www.csdn.net/Develop/read_article.asp?id=15043
用的Unicode和GB的转换库如下地址
http://www.blueidea.com/user/qswh/qswhU2GB.js
148k的js,本地测试没有问题,但搁到网上就会觉得有点慢了

所以需要一个精简版,采录的只是GB2312编码,即部分GBK,但够用即可
这次特别精简了代码,但功能不变,区别只是该版只能作用于常见汉字。
什么马配什么鞍,也修改了UrlEncode和getSpell的算法,请大家不要混淆。
这次qswhGB2312.js只有18k,可在网上随意使用

Unicode和GB的转换库和UrlEncode和getSpell函数,请下载
http://www.blueidea.com/user/qswh/qswhGB2312.js

主要代码如下
var strGB="啊阿...鼾齄";//GB2312的字符串,略
var qswhSpell=["a",0,..,"zuo",3747];//拼音的对照表,略
function UrlEncode(str){
 var i,c,p,q,ret="",strSpecial="!/"#$%&'()*+,/:;<=>?@[/]^`{|}~%";
 for(i=0;i<str.length;i++){
  if(str.charCodeAt(i)>=0x4e00){
   var p=strGB.indexOf(str.charAt(i));
   if(p>=0){
    q=p%94;
    p=(p-q)/94;
    ret+=("%"+(0xB0+p).toString(16)+"%"+(0xA1+q).toString(16)).toUpperCase();
   }
  }
  else{
   c=str.charAt(i);
   if(c==" ")
    ret+="+";
   else if(strSpecial.indexOf(c)!=-1)
    ret+="%"+str.charCodeAt(i).toString(16);
   else
    ret+=c;
  }
 }
 return ret;
}

function getSpell(str,sp){
 var i,c,t,p,ret="";
 if(sp==null)sp="";
 for(i=0;i<str.length;i++){
  if(str.charCodeAt(i)>=0x4e00){
   p=strGB.indexOf(str.charAt(i));
   if(p>-1&&p<3755){
    for(t=qswhSpell.length-1;t>0;t=t-2)if(qswhSpell[t]<=p)break;
    if(t>0)ret+=qswhSpell[t-1]+sp;
   }
  }
 }
 return ret.substr(0,ret.length-sp.length);
}

sp是分隔符,范例如下
<script src=qswhGB2312.js></script>

<script language=javascript>
document.write(UrlEncode("中文 <>/"#%{}|^~[]`&?+Abc"),"<br>")
document.write(getSpell("中国程序员大本营"),"<br>")
document.write(getSpell("秋水无恨","'"),"<br>")
</script>

ps.该文章现仅限在csdn文档中心,如要转载,请和作者联系,否则后果自负。

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

现在想要获取的数据,按need_mi_date字段的时间顺序按asc显示,然后need_mi_date为空的都排序到有值的后面。要怎么改以下代码 public function index() { $name="Micontrol"; $map = $this->_search ($name); if (method_exists ( $this, '_filter' )) { $this->_filter ( $map ); } $model = D ($name); if (! empty ( $model )) { $this->_list ( $model, $map, 'need_mi_date'); var_dump($model->getLastSql()); $_SESSION['mi_map'] = $map; } $User = M("User"); $users = $User->field('id,nickname,account')->where("(site='".$_SESSION['loginSite']."' and sub_type='MI') or account='poho.zhong'")->select(); $this->assign('users',$users); $MI = M("Micontrol"); $checker = $MI->distinct(true)->where('assign_checker<>""')->field('assign_checker')->select(); $this->assign('checker',$checker); $this->display (); return; } public function _list($model, $map, $sortBy = '', $asc = true) { //sort if (!empty ( $_REQUEST ['_order'] )) { $order = $_REQUEST ['_order']; } else { $order = ! empty ( $sortBy ) ? $sortBy : $model->getPk (); } //sost: 0 desc if (isset ( $_REQUEST ['_sort'] )) { $sort = $_REQUEST ['_sort'] == 'asc' ? 'asc' : 'desc'; //dwz } else { $sort = $asc ? 'asc' : 'desc'; } $count = $model->where ( $map )->count ( 'id' ); if ($count > 0) { import ( "@.ORG.Util.Page" ); //create page if (! empty ( $_REQUEST ['numPerPage'] )) { $listRows = $_REQUEST ['numPerPage']; } else { $listRows = ''; } $p = new Page ( $count, $listRows ); $voList = $model->where($map)->order( "`" . $order . "` " . $sort)->limit($p->firstRow . ',' . $p->listRows)->select ( ); // if ($_SESSION['loginUserName'] == "Admin") { // echo $model->getLastSql(); // exit(); // } //combine page condition foreach ( $map as $key => $val ) { if (! is_array ( $val )) { $p->parameter .= "$key=" . urlencode ( $val ) . "&"; } } $page = $p->show (); $sortImg = $sort; $sortAlt = $sort == 'desc' ? L('sort_asc') : L('sort_des'); $sort = $sort == 'desc' ? 1 : 0; $this->assign ( 'list', $voList ); $this->assign ( 'sort', $sort ); $this->assign ( 'order', $order ); $this->assign ( 'sortImg', $sortImg ); $this->assign ( 'sortType', $sortAlt ); $this->assign ( "page", $page ); } //dwz $this->assign ( 'totalCount', $count ); $this->assign ( 'numPerPage', $p->listRows ); $this->assign ( 'currentPage', !empty($_REQUEST[C('VAR_PAGE')])?$_REQUEST[C('VAR_PAGE')]:1); Cookie::set ( '_currentUrl_', __SELF__ ); return; }
最新发布
11-04
你当前的需求是: - 按 `need_mi_date` 字段升序(ASC)排序; - 但 **`need_mi_date` 为空的记录要排在有值的后面**,即:非空日期靠前,按时间升序;空值统一排在末尾。 目前你的代码调用的是: ```php $this->_list($model, $map, 'need_mi_date'); ``` 这会生成类似: ```sql ORDER BY `need_mi_date` ASC ``` 但这样会导致 `NULL` 值排在最前面(在 MySQL 中,`ORDER BY col ASC` 时,`NULL` 默认最小,排最前),不符合你的需求。 --- ### ✅ 解决方案 你需要修改排序逻辑,使用 **数据库字段表达式** 来实现: 先按“是否为 NULL”分组(非 NULL 在前),再在非 NULL 组内按时间升序。 #### 修改方式: 将原来的 `_list` 调用改为传入一个 SQL 表达式作为排序字段,而不是直接传字段名。 --- ### ✅ 修改后的代码如下: ```php public function index() { $name = "Micontrol"; $map = $this->_search($name); if (method_exists($this, '_filter')) { $this->_filter($map); } $model = D($name); if (!empty($model)) { // 关键修改:使用自定义 ORDER BY 表达式 $this->_list($model, $map, '(CASE WHEN need_mi_date IS NULL THEN 1 ELSE 0 END), need_mi_date', true); var_dump($model->getLastSql()); $_SESSION['mi_map'] = $map; } $User = M("User"); $users = $User->field('id,nickname,account') ->where("(site='".$_SESSION['loginSite']."' and sub_type='MI') or account='poho.zhong'") ->select(); $this->assign('users', $users); $MI = M("Micontrol"); $checker = $MI->distinct(true)->where('assign_checker<>""')->field('assign_checker')->select(); $this->assign('checker', $checker); $this->display(); return; } ``` --- ### 🔍 解释 SQL 排序逻辑: ```sql ORDER BY (CASE WHEN need_mi_date IS NULL THEN 1 ELSE 0 END) ASC, need_mi_date ASC ``` - 第一列:判断 `need_mi_date` 是否为 `NULL`,如果是则标记为 `1`,否则为 `0`; - 升序排列时,`0 < 1`,所以非空日期(0)排前面,空值(1)排后面; - 第二列:在非空部分中,按 `need_mi_date` 升序排序。 这样就实现了: > 所有 `need_mi_date` 非空的记录按时间从早到晚排序,然后所有空值记录排在最后。 --- ### 🛠️ 注意事项 1. ThinkPHP 3.x 支持在 `order()` 方法中使用原生 SQL 片段。 2. `$sortBy` 参数现在是一个复合表达式字符串,会被直接拼接到 `ORDER BY` 后面。 3. 确保字段名正确(如 `need_mi_date` 存在且拼写无误)。 4. 如果该字段类型是 `DATETIME` 或 `DATE`,效果更准确。 --- ### 💡 可选优化(防止注入) 虽然这里是静态表达式,不涉及用户输入,所以安全。但为了清晰,也可以显式调用 `order()`: ```php // 替代方案:绕过 _list 的排序参数,在 _list 内部特殊处理 ``` 但你已有 `_list` 封装,推荐做法是增强 `_list` 对表达式的支持 —— 而你现在正是这么用的,没问题! --- ### ✅ 最终效果示例数据排序: | need_mi_date | |--------------| | 2024-01-01 | | 2024-03-15 | | 2025-01-01 | | NULL | | NULL | ✔️ 正确顺序! --- ###
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值