亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪(fǎng)問(wèn)板塊 發(fā)新帖
查看: 5665 | 回復(fù): 9
打印 上一主題 下一主題

解決數(shù)據(jù)庫(kù)系統(tǒng)中存在的半個(gè)漢字問(wèn)題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2009-03-26 14:30 |只看該作者 |倒序?yàn)g覽
我們的漢字在計(jì)算機(jī)系統(tǒng)里面存儲(chǔ)時(shí)需要2個(gè)字節(jié)的空間。當(dāng)數(shù)據(jù)庫(kù)使用單字節(jié)字符集的時(shí)候,數(shù)據(jù)庫(kù)允許存儲(chǔ)半個(gè)漢字,因?yàn)樗加玫氖且粋(gè)字節(jié)的空間為一個(gè)有效數(shù)據(jù),例如通常的英文字符集:en_us.819或en_us.utf8。但是當(dāng)數(shù)據(jù)庫(kù)使用多字節(jié)字符集的時(shí)候,由于半個(gè)漢字為非法的不完整字符,會(huì)導(dǎo)致數(shù)據(jù)庫(kù)在存儲(chǔ)這種數(shù)據(jù)的時(shí)候報(bào)錯(cuò)illegal character,例如通常的中文字符集:zh_cn.gb和zh_cn.GB18030-2000。為了解決這個(gè)問(wèn)題,我編寫(xiě)了一個(gè)小程序用于過(guò)濾掉數(shù)據(jù)庫(kù)數(shù)據(jù)中存在的半個(gè)漢字問(wèn)題。

原理:
漢字由2個(gè)字節(jié)組成,且每個(gè)部分其ascii編碼都大于127,因此我們?cè)诎l(fā)現(xiàn)一個(gè)字符的ascii編碼大小大于127的情況下需要檢測(cè)緊隨的一個(gè)字節(jié)其ascii編碼是否大于127,如果是則為一個(gè)完整的漢字,反之則是半個(gè)漢字。

以下為使用步驟:
1.將數(shù)據(jù)庫(kù)中的數(shù)據(jù)卸載為存文本形式
2.使用trim infile outfile對(duì)該數(shù)據(jù)進(jìn)行過(guò)濾,它會(huì)將所有緊跟中非中文字符的半個(gè)漢字去除
3.設(shè)置中文字符集以后,將該數(shù)據(jù)重新裝載進(jìn)數(shù)據(jù)庫(kù)


/*******************************************************************************
*
*       Module:         trim
*       Author:         Richard ZHAN
*       Description:    Eliminate half Chinese character followed by a non Chinese character in a plain data file
*
*       Change Log
*
*       Date            Name            Description.................
*       03/20/2009      Richard ZHAN    Start Program
*
*******************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <strings.h>

#define LEN 4096

int
main (int argc, char *argv[])
{
  int rfd, wfd, len1, len2, i;
  char hi, *p1, *p2, str1[LEN], str2[LEN];
  unsigned char ascii_hi = '\x7F';

  if (argc != 3)
    {
      usage ();
      exit (1);
    }
  if ((rfd = open (argv[1], O_RDONLY)) == -1)
    {
      printf ("Cannot open read file!\n");
      exit (1);
    }
  else if ((wfd = open (argv[2], O_RDWR | O_CREAT, 0644)) == -1)
    {
      printf ("Cannot open write file!\n");
      close (rfd);
      exit (1);
    }
  else
    {
      hi = '\x0';
      while ((len1 = read (rfd, str1, LEN)) > 0)
        {
          len2 = 0;
          bzero (str2, LEN);
          p2 = str2;
          for (p1 = str1, i = 0; i < len1; p1++, i++)
            {
              if ((unsigned char) (*p1) > ascii_hi)
                {
                  if (hi == '\x0')
                    {
                      hi = *p1;
                    }
                  else
                    {
                      *p2++ = hi;
                      *p2++ = *p1;
                      len2 += 2;
                      hi = '\x0';
                    }
                }
              else
                {
                  *p2++ = *p1;
                  len2++;
                  hi = '\x0';
                }
            }
          if (write (wfd, str2, len2) != len2)
            {
              perror ("Encounter write error\n");
              close (rfd);
              close (wfd);
              exit (1);
            }
        }
      if (len1 < 0)
        {
          perror ("Encounter read error\n");
          close (rfd);
          close (wfd);
          exit (1);
        }
    }
  close (rfd);
  close (wfd);
  exit (0);
}

usage ()
{
  fprintf (stderr, "Usage: trim infile outfile\n");
  return 0;
}

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2009-03-26 18:22 |只看該作者
不好意思,你這個(gè)原理是不正確的,很多漢字的后半部分ascII碼是小于127的。

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2009-03-26 18:33 |只看該作者

回復(fù) #2 xxyyy 的帖子

是否能舉例說(shuō)明一下,謝謝!

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2009-03-27 08:28 |只看該作者
GB 18030的雙字節(jié)部分完全采用了GBK的內(nèi)碼系統(tǒng)。在此基礎(chǔ)上,做了四字節(jié)擴(kuò)展,四個(gè)字節(jié)的編碼空間依次是:0x81到0xFE,0x30到0x39,0x81到0xFE,0x30到0x39?偣1,587,600個(gè)碼位。
所以,你的這種判斷方法只適應(yīng)于GB2312,判斷GBK字符時(shí)都會(huì)出錯(cuò)

論壇徽章:
11
金牛座
日期:2015-03-19 16:56:22數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2016-08-02 06:20:00數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2016-04-24 06:20:00數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2016-04-13 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-13 06:20:00數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2016-02-03 06:20:00數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2015-08-06 06:20:00季節(jié)之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41數(shù)據(jù)庫(kù)技術(shù)版塊每日發(fā)帖之星
日期:2016-08-18 06:20:00
5 [報(bào)告]
發(fā)表于 2009-03-27 10:15 |只看該作者
我是看不懂啦~~

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2009-03-28 18:44 |只看該作者

回復(fù) #4 whitecat 的帖子

謝謝指教!那是否方便告知有沒(méi)有什么切實(shí)可行的方法對(duì)不同的GB編碼系統(tǒng)都能適用呢,無(wú)論何種編碼都能準(zhǔn)確判斷出是有效漢字?請(qǐng)不吝賜教!

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2009-03-28 20:28 |只看該作者
GBK范圍:
1st byte                     2nd byte
0x81~0xfe   0x40~0x7e and 0x80~0xfe

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2009-03-29 18:30 |只看該作者

回復(fù) #7 MicroHard 的帖子

那如果是這樣要是遇到半個(gè)字符豈不是無(wú)法根據(jù)字符的ascii數(shù)值來(lái)進(jìn)行判斷?

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2009-04-05 01:12 |只看該作者
镕E946

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2009-04-09 11:11 |只看該作者
可以參考一下這個(gè)帖子
http://bbs2.chinaunix.net/thread-429236-1-1.html
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專(zhuān)區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP