Thứ Năm, 28 tháng 1, 2010

VietOCR 1.5: Nhận dạng ký tự tiếng Việt "chuẩn không cần chỉnh"

Từ khoá: VietOCR, nhận dạng kí tự, tiếng việt, nhận dạng ảnh

Sau nhiều lần nâng cấp, phiên bản mới của VietOCR đã có thêm nhiều tính năng đáng giá như: hỗ trợ chế độ quét tích hợp, nhận dạng ký tự tiếng Việt trên nhiều dạng ảnh (bmp, jpg, tiff, png), hỗ trợ các tài liệu ảnh nhiều trang và cơ chế xử lý hậu kỳ, giúp khắc phục một số lỗi về ngữ nghĩa, chính tả sau khi xử lý.

Đặc biệt chương trình hoàn toàn miễn phí. Dung lượng: 4,2MB. Tải tại đây.

So với một số phần mềm nhận dạng văn bản tiếng Việt như: VnDOCR, VietOCR thuộc vào hàng “ngon, bổ” và miễn phí. Tốc độ biên dịch nội dung nhanh, giao diện đơn giản, dễ sử dụng và mức độ chính xác có thể đạt hơn 80%.

VietOCR bao gồm hai phiên bản: phiên bản GUI Form chạy trên Windows (hỗ trợ cả 32/64bit) và phiên bản Swing GUI (sử dụng Java) có thể hoạt động trên nhiều hệ điều hành khác nhau như: Windows, Linux,…

VietOCR có thể sử dụng như một trình nhận dạng ký tự quang học độc lập (xử lý các file ảnh, dữ liệu sẵn có) hoặc kết hợp với chức năng quét để xử lý các tài liệu được nạp từ bên ngoài.

Thao tác xử lý văn bản được chia thành các loại:

1. Nhận dạng tài liệu ảnh:

Thông thường khi quét xong một tài liệu văn bản, file thu được sẽ được lưu dưới dạng một tài liệu ảnh và không thể xử lý (xoá text, nhập liệu, chỉnh sửa nội dung,…) như ban đầu. VietOCR sẽ có nhiệm vụ chuyển đổi các tài liệu này sang văn bản để bạn có thể xử lý dễ dàng. VietOCR hỗ trợ khá nhiều định dạng ảnh như: jpg, bmp, png, tiff, tuy nhiên không hỗ trợ định dạng gif.

Để sử dụng chương trình, bạn cần cài đặt thêm gói Visual C++ 2008 SP1 (nếu chưa cài đặt vào hệ thống), sau đó truy cập menu File > Open, trong phần File of types bạn chọn là All Image Files và nạp vào file văn bản cần xử lý. Xong, nhấn nút Open.

Tiếp đến, trên giao diện chính, bạn sẽ nhìn thấy hai khu vực: khu vực nằm bên trái chứa nội dung của file tài liệu vừa mới thêm vào, khung bên phải sẽ là tài liệu sau khi trích xuất từ file ảnh. Khi phần nội dung đã được nạp xong, bạn nhấn đề mục OCR Language (góc trên bên phải màn hình) và chọn Vietnamese. Sau đó, nhấn nút OCR để bắt đầu quá trình biên dịch nội dung, tốc độ nhanh hay chậm còn tùy thuộc vào độ dài, ngắn của văn bản và tốc độ xử lý của máy tính.

Sau khi biên dịch xong, bạn sẽ có ngay phần dữ liệu dạng text, có thể xoá hay thay đổi một cách dễ dàng. Một điểm hay của VietOCR, đó là khả năng tích hợp bộ gõ tiếng Việt (hoạt động dựa trên bộ gõ Unikey), cho phép bạn dễ dàng thay đổi nội dung văn bản có dấu mà không cần bộ gõ Unikey thường trực nơi khay hệ thống. Để định bộ gõ trong VietOCR, bạn truy cập menu Settings > Viet Input Method và chọn một trong các kiểu gõ: VNI, Telex, VIQR với Font mặc định là Unicode được tích hợp sẵn. Trường hợp chỉ muốn nhận dạng riêng một khu vực nào đó, bạn giữ trái chuột và rê vào vùng văn bản mà bạn muốn trích xuất. Khi đó, chỉ nội dung của vùng này sẽ được hiển thị bên khung phải màn hình. Nếu muốn biên dịch tài liệu nhiều trang, bạn truy cập menu Command > OCR All Pages.

Để “thử” kiểm tra khả năng nhận diện văn bản của chương trình trên các định dạng khác nhau, người viết đã sử dụng thư viện mẫu văn bản có sẵn (C:\Program Files\VietUnicode\VietOCR.NET\samples) và dùng chương trình MS Paint của Windows để lưu lại thành các định dạng khác nhau như: PNG, JPG và BMP (256 bit) từ file gốc có định dạng .TIFF

Kết quả, cả ba trường hợp đều nhận dạng được văn bản khá chuẩn xác. Tuy nhiên một số dấu câu chưa đúng và một vài từ vẫn còn sai chính tả, không rõ nghĩa nhưng mức độ biên dịch so với bản gốc là khá chuẩn.

2. Cài đặt máy quét:

Nếu nhu cầu của bạn là xử lý các tài liệu bên ngoài thông qua hệ thống quét của chương trình, nhất thiết bạn phải cài đặt thêm máy quét. Để làm việc này, bạn truy cập vào thư mục cài đặt của VietOCR, tìm và sao chép file WIAAut.dll (C:\Program Files\VietUnicode\VietOCR.NET) vào thư mục C:\Windows\System32.

Sau đó, bạn vào Start > Run, gõ lệnh regsvr32 C:\Windows\System32\WIAAut.dll để đăng ký thư viện này với Windows. Khi đăng ký xong, bạn cài driver cho máy quét và bắt đầu tiến trình xử lý văn bản như trên.

Lưu ý:

- Trong quá trình biên dịch, đôi lúc bạn sẽ gặp phải thông báo lỗi Attemp to read or write protected memory, một trong những nguyên nhân gây ra lỗi này là do văn bản đã định sai hướng (lệch hướng đi, thay vì nằm ngang, văn bản đã chuyển sang hướng đứng), bạn chỉ việc nhấn nút Rotate vài lần cho đúng hướng là xong.

- Nếu không có máy quét và bạn vẫn muốn “trải nghiệm” tính năng của phần mềm, bạn có thể tải tiện ích ImagePrinter, giúp bạn chuyển đổi bất kỳ tài liệu nào sang bốn định dạng hỗ trợ sẵn của chương trình (bmp, png, tiff, jpg). Trường hợp nếu muốn chuyển giao diện chương trình sang tiếng Việt, bạn truy cập menu Settings > User Interface Language, chọn Vietnamese.

Cũng tương tự quá trình nhận dạng tài liệu ảnh ở trên, trong trường hợp này tài liệu quét sẽ được chia thành hai dạng để kiểm tra: dạng văn bản thuần (text) và văn bản kèm hình ảnh. Quá trình xử lý và biên dịch được thực hiện như bước 1. Kết quả chương trình nhận dạng tốt với các văn bản thuần và gặp phải tình trạng lỗi OCR Operation với các tài liệu có kèm hình ảnh. Việc thực hiện này cũng xảy ra với các định dạng khác.

Một điều lưu ý với các bạn, để quá trình nhận dạng ảnh được chính xác, độ phân giải của bản quét phải đạt chuẩn 300dpi, không mờ, càng sạch và rõ càng tốt.

3. Xử lý tài liệu PDF:

Ngoài khả năng nhận dạng các tài liệu ảnh, VietOCR còn có khả năng xử lý các tài liệu PDF. Để có thể sử dụng được tính năng này trong VietOCR, bạn cần cài đặt thêm gói GPL GhostScript 8.7. Sau khi cài xong, bạn thực hiện việc xử lý tương tự các bước trên (với các tài liệu PDF có chứa hình ảnh, kết quả vẫn bị lỗi như trường hợp hai).

Nhìn chung, VietOCR có khả năng xử lý văn bản tiếng Việt tốt, độ chính xác khá cao và tương thích với nhiều định dạng ảnh khác nhau trong điều kiện văn bản thuần (không chứa hình ảnh), bạn có thể dùng văn bản sau khi xử lý để phục vụ cho công việc mà không phải tốn thời gian chỉnh sửa nhiều.

Theo ECHIP

Thứ Hai, 4 tháng 1, 2010

Lập trình hướng đối tượng trong PHP 5

a. Khai báo lớp và thể hiện của lớp trong PHP
Như chúng ta đã biết, một lớp bao gồm các kiểu thuộc tính và phương thức.
Trong PHP5, chúng ta khai báo một lớp với cú pháp như sau:

Quote:

class tên_lớp
{
// Danh sách các biến, hằng, lớp... (thuộc tính)
// Danh sách các hàm (phương thức)
}

Trong đó, các lớp được khai báo thông qua từ khoá class, các thuộc tính
được khai báo dưới dạng các biến, còn các phương thức được xây dựng
dưới dạng các hàm.

Các thuộc tính và các phương thức trong lập
trình hướng đối tượng có thể được thiết lập những tính chất đặc biệt
như : riêng tư (private), công cộng (public)... Các tính chất này
thường được đặt trước các khai báo thuộc tính và phương thức.
Ví dụ đơn giản dưới đây thể hiện một lớp có tên là ho_so với các thuộc tính công cộng bao gồm ho_ten, ngay_sinh:

Quote:

class hoso
{
public $ho_ten;
public $ngay_sinh;
}

Đoạn mã trên mới chỉ khai báo một lớp thực thể với hai biến là $ho_ten
và $ngay_sinh. Bây giờ chúng ta sẽ khai báo một thể hiện của lớp trên.
Để khai báo một thể hiện của một lớp, ta dùng từ khoá new, tiếp đó là tên lớp:
$ten_thuc_the = new ten_lop;
Để truy cập vào từng thuộc tính hay phương thức của lớp, ta dùng toán tử -> với cú pháp như sau:
$ten_thuc_the-->ten_thuoc_tinh;
Ví dụ sau đây sẽ tạo ra một thực thể của một cá nhân có tên là Hoàng:

Quote:

<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</HEAD>
<BODY>
<?
class hoso
{
public $ho_ten;
public $ngay_sinh;
}
$hoang=new hoso;
$hoang->ho_ten="Nguyễn Huy Hoàng";
$hoang->ngay_sinh = "25/7/2003";
echo "Họ tên: " . $hoang->ho_ten . ". Ngày sinh: " . $hoang->ngay_sinh;
?>
</BODY>
</HTML>

Bây giờ, chúng ta sẽ trang bị thêm một phương thức để thay đổi giá trị
của các thuộc tính ho_ten và ngay_sinh. Để tham chiếu tới các phần tử
trong chính bản thân lớp đối tượng, chúng ta sử dụng biến $this và toán
tử tham chiếu ->, theo sau đó là tên của phương thức hoặc thuộc tính:

Quote:

<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</HEAD>
<BODY>
<?
class hoso
{
public $ho_ten;
public $ngay_sinh;
public function lap_gia_tri($hoten,$ngaysinh)
{
$this->ho_ten = $hoten;
$this->ngay_sinh=$ngaysinh;
}
}
$hoang=new hoso;
$hoang->lap_gia_tri("Nguyễn Huy Hoàng","25/7/2003");
echo "Họ tên: " . $hoang->ho_ten . ". Ngày sinh: " . $hoang->ngay_sinh;
?>
</BODY>
</HTML>

Chú ý rằng khi khai báo một lớp, chúng ta cũng có thể thiết lập những
giá trị mặc định ban đầu cho tất cả các thành viên được tạo ra từ lớp
đó. Ví dụ:

Quote:

HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</HEAD>
<BODY>
<?
class hoso
{
public $ho_ten = "Nguyễn Huy Hoàng";
public $ngay_sinh = "25/7/2003";
public function lap_gia_tri($hoten,$ngaysinh)
{
$this->ho_ten = $hoten;
$this->ngay_sinh=$ngaysinh;
}
}
$hoang=new hoso;
echo "Họ tên: " . $hoang->ho_ten . ". Ngày sinh: " . $hoang->ngay_sinh;
?>
</BODY>
</HTML>

Cơ chế đóng kín và tính rõ ràng của các phần tử trong lớp
Như chúng ta đã biết, lập trình hướng đối tượng tập trung vào việc “đóng gói” các phương thức và thuộc tính của một đối tượng nào đó.
Trong lập trình hướng đối tượng, các thành viên trong một lớp cần phải được xác định xem chúng có thể được truy xuất từ đâu (tính rõ ràng). Có ba khả năng xảy ra:
- Chế độ truy xuất công cộng (public): Các thành viên nếu được thiết lập ở chế độ này sẽ được nhìn thấy và truy xuất ở mọi nơi trong chương trình.
- Chế độ truy xuất riêng tư (private): Các thành viên nếu được thiết lập ở chế độ này sẽ chỉ được nhìn thấy và truy xuất được ở bản thân lớp định nghĩa thành viên đó.
- Chế độ bảo vệ (protected): Chế độ này sẽ được dùng để giới hạn truy cập tới các lớp được thừa kế và bản thân lớp định nghĩa thành viên đó.
Trong PHP5, tất cả các thành viên của một lớp đều phải được khai báo tính rõ ràng với các từ khoá tương ứng là public, protected và private.
Ví dụ:

Quote:

<?php
class MyClass
{
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';
public function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj = new MyClass();
echo $obj->public; // Làm việc tốt
echo $obj->protected; // Gây lỗi do thuộc tính $protected đã bị đặt ở chế độ bảo vệ
echo $obj->private; // Gây lỗi do thuộc tính $protected đã bị đặt ở chế độ riêng tư
$obj->printHello(); // Hoạt động bình thường, do các thuộc tính được triệu gọi bên trong một phương thức nằm trong lớp.
class MyClass2 extends MyClass
{
protected $protected = 'Protected2';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj2 = new MyClass2();
echo $obj->public; // Chạy tốt
echo $obj2->private; // Chưa được định nghĩa
echo $obj2->protected; // Gây lỗi
$obj2->printHello(); // Hiển thị Public, Protected2, not Private
?>

Nếu như chúng ta không đặt các từ khoá xác định tính rõ ràng của các thành viên, theo mặc định chúng sẽ ở chế độ public.

Kế thừa lớp trong PHP 5
Ở phần trên, các bạn đã biết đến khái niệm kế thừa giữa các lớp, đó là khả năng một lớp có thể được kế thừa các thành phần dữ liệu cũng như phương thức của một lớp nào đó. Lớp thừa kế những phương thức và thuộc tính của lớp khác được gọi là lớp con, còn lớp được kế thừa được gọi là lớp cha.
Trong PHP, một lớp có thể thừa kế các phương thức cũng như các thuộc tính của một lớp khác bằng cách sử dụng từ khoá extends trong khi khai báo tên lớp.
Ví dụ dưới đây thực hiện việc mở rộng lớp hoso ở trên thêm một số thuộc tính mới bằng cách kế thừa từ lớp hoso:

Quote:

<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</HEAD>
<BODY>
<?
class hoso
{
public $ho_ten = "Nguyễn Huy Hoàng";
public $ngay_sinh = "25/7/2003";
public function lap_gia_tri($hoten,$ngaysinh)
{
$this->ho_ten = $hoten;
$this->ngay_sinh=$ngaysinh;
}
}
class hoso2 extends hoso
{
public $noi_sinh="Thanh Hoá";
public function in_hoso()
{
echo "Họ tên: " . $this->ho_ten . ". Ngày sinh: " . $this->ngay_sinh . " . Nơi sinh: " . $this->noi_sinh;
}
}
$hoang=new hoso2;
$hoang->in_hoso();
?>
</BODY>
</HTML>

Các phương thức và thành viên thừa kế từ lớp cha sang lớp con có thể bị nạp chồng (thay đổi) nếu như lớp cha không định nghĩa chúng dưới dạng các phương thức cuối cùng với từ khoá final.
Kỹ thuật “nạp chồng” có nghĩa là chúng ta có thể định nghĩa lại các hàm trong lớp cha bằng các hàm cùng tên trong lớp con nhưng hai hàm này có hai chức năng hoàn toàn khác nhau. Nhiều người gọi kỹ thuật này là “đa hình” do chúng tạo ra nhiều hình thái khác nhau ở các lớp thừa kế.
Chúng ta có thể truy cập đến các phương thức hay thành viên đã bị nạp chồng bằng cách tham chiếu chúng với từ khoá parent và toán tử tham chiếu ::, tiếp theo là phương thức hay thành viên cần tham chiếu (parent::ten_phuong_thuc).
Ví dụ dưới đây mô tả cách thức nạp chồng:

Quote:

<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</HEAD>
<BODY>
<?
class hoso
{
public $ho_ten = "Nguyễn Huy Hoàng";
public $ngay_sinh = "25/7/2003";
public function in_hoso()
{
echo "Họ tên:" . $this->ho_ten . ". Ngày sinh: " . $this->ngay_sinh;
}
}
class hoso2 extends hoso
{
public $noi_sinh="Thanh Hoá";
public function in_hoso()
{
parent::in_hoso();
echo ". Nơi sinh: " . $this->noi_sinh;
}
}
$hoang=new hoso2;
$hoang->in_hoso();
?>
</BODY>
</HTML>

Như các bạn đã thấy, đối tượng $hoang thuộc lớp hoso2 đã được kế thừa mọi thứ ở lớp hoso. Trong lớp hoso2, chúng ta đã định nghĩa một hàm trùng tên với một hàm đã có sẵn trong lớp hoso (hàm in_hoso()). Hàm in_hoso() của lớp hoso2 đã nạp chồng thay thế cho hàm in_hoso() của lớp hoso, nhưng trong bản thân nó lại có thể triệu gọi trực tiếp đến hàm in_hoso() trong lớp cha (hoso).

Nguồn: phpvn.org 

TCVN2UNI _New

Đây là code mà mình dùng trong một project PHP như sau :
Dữ liệu lấy ra từ DB MS SQL có font TCVN3 , cần chuyển sang font unicode để cho vào DB MySQL ,rồi hiển thị ra Web.
!
<?php
/*
    thuc.lehuy@gmail.com
*/
class takenewcustomer
{
    function connect()
    {
        $host = "localhost";
        $database = "database";
        $username = "user";
        $pass = "passwww";
        $con = mssql_connect($host,$username,$pass);
        if(!$con)
        {
            return 0;
        }
        mssql_select_db($database, $con);
        return $con;
    }
    /*
    * Lấy thông tin điểm khách hàng trong DB
    */
    function takenewcustomer($lastdate = null){
        $query = "select ma_kh as username,ten_kh as name,dia_chi as address from user";
        $link = $this->connect();
        $result = mssql_query($query,$link);
        $rows = array();
        $this->mapping();
        while($row = mssql_fetch_assoc($result)){
            $row["name"] = $this->TCVN3ToUnicode($row["name"]);
            $row["address"] = $this->TCVN3ToUnicode($row["address"]);
            $rows[]=$row;
        }
        mssql_free_result($result);
        return $rows;
    }
/* // Mảng chứa vị trí các kí tự tiếng việt Unicode trong bảng mã ASCII
    //var $unipos  = array(225,224,7843,227,7841,259,7855,7857,7859,7861,7863,226,7845,7847,7849,7851,7853,233,232,7867,7869,7865,234,7871,7873,7875,7877,7879,237,236,7881,297,7883,243,242,7887,245,7885,244,7889,7891,7893,7895,7897,417,7899,7901,7903,7905,7907,250,249,7911,361,7909,432,7913,7915,7917,7919,7921,253,7923,7927,7929,7925,273,193,192,7842,195,7840,258,7854,7856,7858,7860,7862,194,7844,7846,7848,7850,7852,201,200,7866,7868,7864,202,7870,7872,7874,7876,7878,205,204,7880,296,7882,211,210,7886,213,7884,212,7888,7890,7892,7894,7896,416,7898,7900,7902,7904,7906,218,217,7910,360,7908,431,7912,7914,7916,7918,7920,221,7922,7926,7928,7924,272);
    //Mảng chứa vị trí các kí tự tiếng việt Utf8 trong bảng mã ASCII
    //var $utfpos = array(50081,50080,14793379,50083,14793377,50307,14793391,14793393,14793395,14793397,14793399,50082,14793381,14793383,14793385,14793387,14793389,50089,50088,14793403,14793405,14793401,50090,14793407,14793601,14793603,14793605,14793607,50093,50092,14793609,50345,14793611,50099,50098,14793615,50101,14793613,50100,14793617,14793619,14793621,14793623,14793625,50849,14793627,14793629,14793631,14793633,14793635,50106,50105,14793639,50601,14793637,50864,14793641,14793643,14793645,14793647,14793649,50109,14793651,14793655,14793657,14793653,50321,50049,50048,14793378,50051,14793376,50306,14793390,14793392,14793394,14793396,14793398,50050,14793380,14793382,14793384,14793386,14793388,50057,50056,14793402,14793404,14793400,50058,14793406,14793600,14793602,14793604,14793606,50061,50060,14793608,50344,14793610,50067,50066,14793614,50069,14793612,50068,14793616,14793618,14793620,14793622,14793624,50848,14793626,14793628,14793630,14793632,14793634,50074,50073,14793638,50600,14793636,50863,14793640,14793642,14793644,14793646,14793648,50077,14793650,14793654,14793656,14793652,50320);
*/
// Mảng chứa vị trí các kí tự tiếng việt TCVN3 trong bảng mã ASCII
    var $tcvnpos = array(184,181,182,183,185,168,190,187,188,189,198,169,202,199,200,201,203,208,204,206,207,209,170,213,210,211,212,214,221,215,216,220,222,227,223,225,226,228,171,232,229,230,231,233,172,237,234,235,236,238,243,239,241,242,244,173,248,245,246,247,249,253,250,251,252,254,174,16824,16821,16822,16823,16825,161,41406,41403,41404,41405,41414,162,41674,41671,41672,41673,41675,17872,17868,17870,17871,17873,163,41941,41938,41939,41940,41942,18909,18903,18904,18908,18910,20451,20447,20449,20450,20452,164,42216,42213,42214,42215,42217,165,42477,42474,42475,42476,42478,22003,21999,22001,22002,22004,166,42744,42741,42742,42743,42745,23037,23034,23035,23036,23038,167,);
// Mảng chứ vị trí các kí tự unicode tương ứng 1-1 với mảng $tcvnpos
    var $unichars = array("á","à","ả","ã","ạ","ă","ắ","ằ","ẳ","ẵ","ặ","â","ấ","ầ","ẩ","ẫ","ậ","é","è","ẻ","ẽ","ẹ","ê","ế","ề","ể","ễ","ệ","í","ì","ỉ","ĩ","ị","ó","ò","ỏ","õ","ọ","ô","ố","ồ","ổ","ỗ","ộ","ơ","ớ","ờ","ở","ỡ","ợ","ú","ù","ủ","ũ","ụ","ư","ứ","ừ","ử","ữ","ự","ý","ỳ","ỷ","ỹ","ỵ","đ","Á","À","Ả","Ã","Ạ","Ă","Ắ","Ằ","Ẳ","Ẵ","Ặ","Â","Ấ","Ầ","Ẩ","Ẫ","Ậ","É","È","Ẻ","Ẽ","Ẹ","Ê","Ế","Ề","Ể","Ễ","Ệ","Í","Ì","Ỉ","Ĩ","Ị","Ó","Ò","Ỏ","Õ","Ọ","Ô","Ố","Ồ","Ổ","Ỗ","Ộ","Ơ","Ớ","Ờ","Ở","Ỡ","Ợ","Ú","Ù","Ủ","Ũ","Ụ","Ư","Ứ","Ừ","Ử","Ữ","Ự","Ý","Ỳ","Ỷ","Ỹ","Ỵ","Đ");
    // Mảng ánh xạ giữa 2 mảng $tcvnpos và $unichar
    var $mapping = array();
    // Xây dựng mảng $mapping
    function mapping(){
        for($j=0;$j<sizeof($this->unichars);$j++){
            $this->mapping[$this->tcvnpos[$j]] = $this->unichars[$j];
        }
    }
    // Hàm convert TCVN3 to Unicode
    function TCVN3ToUnicode($value = null) {
        $str='';
        for($i=0;$i<strlen($value);$i++){
            $ch = $value[$i];
            // Chuyển kí tự thành vị trí trong ASCII
            $stt = ord($ch);
            if($stt>127){
                //ko là kí tự abc...
                if($this->mapping[$stt]){
                    $unipos = $this->mapping[$stt];
                    $str = $str.$unipos;
                }else{
                    $str = $str.$ch;
                }
            }else{
                // là kí tự abc...
                $str = $str.$ch;
            }
        }
        return $str;
    }
}
?>

Đây là nơi mình tham khảo đối chiếu phần mã của các loại font :
http://www.vovisoft.com...ilities/VietEncoding.htm

Thứ Bảy, 2 tháng 1, 2010

.htaccess là gì ?

-.htaccess là một tập tin được đặt trên các máy chủ hệ Unix (FreeBSD Linux Solaris True64…) và .htaccess chỉ được cấu hình ở mức thư mục.

-Tập tin này có thể điều khiển được khá nhiều thứ thậm chí thay đổi được cả thiết lập mặc định của máy chủ Apache.

-Nếu khai thác tốt .htaccess ta có thể làm nhiều việc khá dễ dàng chỉ với vài dòng lệnh.

Lưu ý khi sử dụng tập tin .htaccess:

Chỉ áp dụng trên máy chủ Apache đã bật chế độ .htaccess nếu chưa bạn hãy thử liên hệ với nhà cung cấp dich vụ hosting.

(Tại localhost chỉ một số phần mềm tạo local mới chạy được chức năng này Pumama thấy VertrigoServ là hoạt động hiệu quả nhất)
Để tạo ra tập tin này bạn có thể sử dụng ngay chương trình Notepad của Windows: chọn chế độ Save as với tên “.htaccess” (ghi cả dấu ” để Notepad không tự thêm đuôi .txt).

.htaccess chỉ có tác dụng đối với những tập tin ngang hàng (trong cùng thư mục với nó) hoặc thư mục con. Với thư mục nó chỉ có tác dụng trong thư mục chứa nó và [separator]thư mục con còn vô tác dụng với thư mục mẹ (parent directory).

Bạn có thể dùng một số chương trình FTP để tải tập tin .htaccess lên host của mình với chế độ ASCII nếu nó vẫn không hoạt động bạn thử chmod với giá trị 644.

+Các chức năng cơ bản và hữu dụng của tập tin .htaccess(tất nhiên là còn nhìu cách khác):

1.Tạo trang báo lỗi mang màu sắc cá nhân

-Trong quá trình làm việc với client nếu có lỗi xảy ra (ví dụ như không tìm thấy tập tin) thì Apache sẽ báo lỗi bằng một trang có sẵn hiển thị mã số của lỗi đó rất không đẹp và khó hiểu.

-Với .haccess thì bạn có thể tự tạo các trang báo lỗi hay hơn. Để làm được điều này thì trong tập tin .htaccess bạn thêm dòng sau:

ErrorDocument mã số lỗi /trangloi.html
Trong đó ErrorDocument là Câu lệnh của tệp tin ( ko được thay đổi) mã số lỗi là một số tự nhiên : trangloi.html là trang web mà bạn muốn hiển thị khi lỗi phát sinh có thể đưa vào tập tin này nội dung hay đồ hoạ gì tùy bạn chẳng hạn liên kết trở về trang chính của trang web

Các mã số lỗi hay gặp là :

401 – Authorization Required (cần password để truy nhập)
400 – Bad request (Lỗi do yêu cầu)
403 – Forbidden (không được vào)
500 – Internal Server Error (lỗi server)
404 – Wrong page (lỗi trang* không tìm thấy…)
VD: Ta có câu lệnh sau trong .htaccess:

ErrorDocument 404/loi404.html
Khi bị dính lỗi này : Trình duyệt sẽ tự động chuyển bạn đến trang loi.404.html nằm ngang hàng với tệp tin .htaccess

2.Chống ăn cắp băng thông (bandwidth)

-Thông thường những dịch vụ lưu trữ web chỉ cung cấp cho bạn một lượng BW nhất định hàng tháng và khi bạn sử dụng hết lượng dữ liệu này* website của bạn sẽ tự động bị đóng cửa. Bạn sẽ phải trả thêm tiền cho lượng băng thông vượt quá hoặc phải buộc lòng chờ đến tháng sau.

-Nếu hình ảnh dữ liệu … của bạn bị các website khác “ăn trộm” (bằng các thủ thuật đơn giản vd: cặp tag [IMG]) làm cho lượng BW của bạn tăng lên thì có nghĩa là bạn sẽ phải trả tiền cho cái mà bạn không sử dụng. Sử dụng tập tin .htaccess là một giải pháp hoàn hảo để ngăn chặn việc sử dụng hình ảnh trái phép trên website của bạn. Bạn chỉ việc đưa vào tập tin .htaccess nội dung sau :

RewriteEngine on RewriteCond %{[Only registered and activated users can see links]} !^$ RewriteCond %{[Only registered and activated users can see links]} !^[Only registered and activated users can see links]([Only registered and activated users can see links])?trangweb\.com/.*$ [NC] RewriteRule \.(gif|jpg)$ – [F]
Ở đoạn mã trên Pumama sử dụng module Rewrite của máy chủ Apache bạn chỉ việc thay đổi trangweb.com thành địa chỉ website của mình.

Thế là ai link đến trang của bạn tùy thích nhưng mà link đến các ảnh sẽ bị lỗi nặng nề.

Hoặc Có thể sử dụng một hình ảnh nào đó cảnh cáo những kẻ “ăn trộm” BW bạn dùng dòng lệnh sau:

RewriteEngine on RewriteCond %{[Only registered and activated users can see links]} !^$ RewriteCond %{[Only registered and activated users can see links]} !^[Only registered and activated users can see links]([Only registered and activated users can see links])?trangweb\.com/.*$ [NC] RewriteRule \.(gif|jpg)$ [Only registered and activated users can see links] [R*L]
Bạn nhớ thay cái link [Only registered and activated users can see links] ([Only registered and activated users can see links]) thành link IMAGE mà bạn muốn hiển thị khi bị ăn cắp IMAGE.

3.Thay thế trang index

-Thông thường khi truy nhập vào một trang web Apache sẽ tìm tập tin index.htm hoặc default.htm trả kết quả về cho trình duyệt* bạn có thể dùng .htaccess thay đổi mặc định này.

DirectoryIndex index.php index .php3 messagebrd.pl index.html index.htm
Với dòng lệnh này thì tất cả các tập tin được liệt kê sẽ được tìm theo thứ tự khi có yêu cầu tới thư mục hiện hành trang nào được tìm thấy đầu tiên sẽ thành trang index của thư mục.

4.Cấm/hạn chế IP truy nhập(rất hay )

Bạn phát hiện ra có một số người phá trang web bạn hay thực hiện những hành vi ko chính đáng làm tổn hại đến trang web của bạn (vd điển hình là bấm nhìu lần vô quảng cáo Google ).Bạn muốn ngăn cấm ko cho người đó típ tục phá phách? .Dòng lệnh sau trong tập tin .htaccess sẽ giúp bạn một cách triệt để và hiệu quả .

+Chỉ cho phép một số IP truy cập:

order deny*allow
deny from all
allow from IP
allow from 203.162.*
Với deny là cấm – allow là cho phép – order deny*allow phải có

Bạn có thể để Ip dạng 203.162.*(có thể thay đổi tùy bạn) – việc này sẽ cấm các Ip bắt đầu bằng 203.162

+Cấm một số ip truy cập:

order allow*deny
allow from all
deny from IP
deny from 203.162.*Với deny là cấm – allow là cho phép – order deny*allow phải có
Bạn có thể để Ip dạng 203.162.*(có thể thay đổi tùy bạn) – việc này sẽ cấm các Ip bắt đầu bằng 203.162

P/S: 2 đoạn code trên rất hữu dụng với các WebMaster trong việc bảo mật.Nó sẽ ngăn ko cho các IP ko hợp lệ vô trang Admin(bạn phải đặt .htaccess trong file ADMIN thì mới có tác dụng)

5.301 redirect

-Cách này sẽ giúp cho các WebMaster mong muốn kiếm tiền từ quảng cáo(nhất là GA) nó sẽ bắt người dùng sử dụng một tên miền nhất định do bạn chọn (một domain sẽ có 2 kiểu địa chỉ (Vd: [Only registered and activated users can see links] ([Only registered and activated users can see links]) và yourdomain.com)

Sử dụng cả 2 kiểu địa chỉ sẽ làm giảm traffic của site bạn nên Pumama lựa chọn cách sau để tối ưu hóa link nhằm thân thiện hơn với các hệ thống quảng cáo.

Bạn thêm code sau vào .htaccess:

RewriteEngine On
RewriteCond %{[Only registered and activated users can see links]} !^\.yourdomain\.com$[NC]
RewriteRule ^(.*)$ [Only registered and activated users can see links] [R=301*L]

Ads by Google

mod_rewrite for IIS 7
.htaccess, mod_rewrite, mod_core mod_proxy, mod_gzip, etc.
www.helicontech.com/ape

Làm sao để thêm số 0 vào phía trước 1 con số PHP

<?php
function number_pad($number,$n) {
return str_pad((int) $number,$n,"0",STR_PAD_LEFT);
}
// use :
number_pad(10,3); // output 010
?>

AJAX Database Example

http://www.w3schools.com/Ajax/ajax_database.asp


AJAX can be used for interactive communication with a database.


AJAX database example

The following example will demonstrate how a web page can fetch information from a database with AJAX technology.

Select a customer in the drop-down box below:

Select a Customer: Alfreds Futterkiste North/South Wolski Zajazd

CustomerID
ALFKI

CompanyName
Alfreds Futterkiste

ContactName
Maria Anders

Address
Obere Str. 57

City
Berlin

PostalCode
12209

Country
Germany


AJAX example explained

The example above contains a simple HTML form and a link to a JavaScript:

<html>
<head>
<script type="text/javascript" src="selectcustomer.js"></script>
</head>
<body>
<form>
Select a Customer:
<select name="customers" onchange="showCustomer(this.value)">
<option value="ALFKI">Alfreds Futterkiste</option>
<option value="NORTS ">North/South</option>
<option value="WOLZA">Wolski Zajazd</option>
</select>
</form>
<div id="txtHint"><b>Customer info will be listed here.</b></div>
</body>
</html>

As you can see it is just a simple HTML form with a drop down box called "customers".

The <div> below the form will be used as a placeholder for info retrieved from the web server.

When the user selects data, a function called "showCustomer()" is executed. The execution of the function is triggered by the "onchange" event. In other words: Each time the user change the value in the drop down box, the function showCustomer() is called.


The AJAX JavaScript

This is the JavaScript code stored in the file "selectcustomer.js":

var xmlhttp
function showCustomer(str)
{
xmlhttp=GetXmlHttpObject();
if (xmlhttp==null)
  {
  alert ("Your browser does not support AJAX!");
  return;
  }
var url="getcustomer.asp";
url=url+"?q="+str;
url=url+"&sid="+Math.random();
xmlhttp.onreadystatechange=stateChanged;
xmlhttp.open("GET",url,true);
xmlhttp.send(null);
}
function stateChanged()
{
if (xmlhttp.readyState==4)
  {
  document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
  }
}
function GetXmlHttpObject()
{
if (window.XMLHttpRequest)
  {
  // code for IE7+, Firefox, Chrome, Opera, Safari
  return new XMLHttpRequest();
  }
if (window.ActiveXObject)
  {
  // code for IE6, IE5
  return new ActiveXObject("Microsoft.XMLHTTP");
  }
return null;
}


The AJAX server page

The server page called by the JavaScript above, is an ASP file called "getcustomer.asp".

The ASP page is written in VBScript for an Internet Information Server (IIS). It could easily be rewritten in PHP, or some other server language. Look at a corresponding example in PHP.

The code runs a query against a database, and returns the result in an HTML table:

<%
response.expires=-1
sql="SELECT * FROM CUSTOMERS WHERE CUSTOMERID="
sql=sql & "'" & request.querystring("q") & "'"
set conn=Server.CreateObject("ADODB.Connection")
conn.Provider="Microsoft.Jet.OLEDB.4.0"
conn.Open(Server.Mappath("/db/northwind.mdb"))
set rs=Server.CreateObject("ADODB.recordset")
rs.Open sql,conn
response.write("<table>")
do until rs.EOF
  for each x in rs.Fields
    response.write("<tr><td><b>" & x.name & "</b></td>")
    response.write("<td>" & x.value & "</td></tr>")
  next
  rs.MoveNext
loop
response.write("</table>")
%>

Thủ thuật dùng IDM Miễn Phí vĩnh viễn


Bước 1 : Gỡ bỏ IDM cũ ròi khởi động lại máy ( nhớ phải restart)
Bước 2 : Mở file hosts theo đường dẫn C:\WINDOWS\system32\drivers\etc bằng một chương trình soạn thảo nào đó như Notepad.
Sau đó thêm vào file này 3 dòng sau rồi lưu lại.
Trích:
207.44.199.159 registeridm.com
207.44.199.16 registeridm.com
127.0.0.1 www.internetdownloadmanager.com
Trích:
# Copyright (c) 1993-1999 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
# 102.54.94.97 rhino.acme.com # source server
# 38.25.63.10 x.acme.com # x client host
127.0.0.1 localhost
127.0.0.1 www.internetdownloadmanager.com
207.44.199.159 registeridm.com
207.44.199.16 registeridm.com
Bước 3: Tải bản IDM mới nhất và cái đặt, sử dụng key bất kỳ để kích hoạt .
Trích:
FName=Chuyen Tinh
LName=Buon
Email=mr.chuyentinhbuon@gmail.com
Serial=7G7QY-NZWKQ-23KRA-RAMQ4
Sau đó nó sẽ active key này và nó báo là sẽ Reboot máy lại.
Cứ nên Reboot máy lại.
Sau khi Reboot máy xong nó sẽ báo là check key thành công .
Hình ảnh đã được thay đổi kích thước. Nhấn vào đây để xem đầy đủ kích thước ảnh. Kích thước bản chính là 830x445 và dung lượng 75KB. Lưu ý: Để tránh tình trạng hỉnh ảnh có đính kèm virus khi click vào sẽ bị nhiễm, vui lòng dùng chức năng Trích dẫn ( Quote) để xem nội dung link hình ảnh trước để tránh trường hợp đáng tiếc xảy ra !
Nếu những ai bị báo là key này đã hết hạn 15 ngày thì vào C:\WINDOWS\system32\drivers\etc mở file hosts add thêm dòng :
Trích:
127.0.0.1 www.internetdownloadmanager.com
Sau đó Copy Paster key trên vào IDM.
Thế là IDM nó tắt và mở lại là đã đăng kí
Giải thích lý do tại sao phải add 2 dòng registeridm.com vào file Hosts:
registeridm.com là chỗ check key IDM ta dùng file host này để giả mạo trang check key của nó nên khi active key kia xong rồi là ta có thể xài IDM vĩnh viễn , có thể update bình thường mà ko cần đợi cập nhật Part .

Nguồn

VietOCR 1.5: Nhận dạng ký tự tiếng Việt "chuẩn không cần chỉnh"

Từ khoá: VietOCR, nhận dạng kí tự, tiếng việt, nhận dạng ảnh

Sau nhiều lần nâng cấp, phiên bản mới của VietOCR đã có thêm nhiều tính năng đáng giá như: hỗ trợ chế độ quét tích hợp, nhận dạng ký tự tiếng Việt trên nhiều dạng ảnh (bmp, jpg, tiff, png), hỗ trợ các tài liệu ảnh nhiều trang và cơ chế xử lý hậu kỳ, giúp khắc phục một số lỗi về ngữ nghĩa, chính tả sau khi xử lý.

Đặc biệt chương trình hoàn toàn miễn phí. Dung lượng: 4,2MB. Tải tại đây.

So với một số phần mềm nhận dạng văn bản tiếng Việt như: VnDOCR, VietOCR thuộc vào hàng “ngon, bổ” và miễn phí. Tốc độ biên dịch nội dung nhanh, giao diện đơn giản, dễ sử dụng và mức độ chính xác có thể đạt hơn 80%.

VietOCR bao gồm hai phiên bản: phiên bản GUI Form chạy trên Windows (hỗ trợ cả 32/64bit) và phiên bản Swing GUI (sử dụng Java) có thể hoạt động trên nhiều hệ điều hành khác nhau như: Windows, Linux,…

VietOCR có thể sử dụng như một trình nhận dạng ký tự quang học độc lập (xử lý các file ảnh, dữ liệu sẵn có) hoặc kết hợp với chức năng quét để xử lý các tài liệu được nạp từ bên ngoài.

Thao tác xử lý văn bản được chia thành các loại:

1. Nhận dạng tài liệu ảnh:

Thông thường khi quét xong một tài liệu văn bản, file thu được sẽ được lưu dưới dạng một tài liệu ảnh và không thể xử lý (xoá text, nhập liệu, chỉnh sửa nội dung,…) như ban đầu. VietOCR sẽ có nhiệm vụ chuyển đổi các tài liệu này sang văn bản để bạn có thể xử lý dễ dàng. VietOCR hỗ trợ khá nhiều định dạng ảnh như: jpg, bmp, png, tiff, tuy nhiên không hỗ trợ định dạng gif.

Để sử dụng chương trình, bạn cần cài đặt thêm gói Visual C++ 2008 SP1 (nếu chưa cài đặt vào hệ thống), sau đó truy cập menu File > Open, trong phần File of types bạn chọn là All Image Files và nạp vào file văn bản cần xử lý. Xong, nhấn nút Open.

Tiếp đến, trên giao diện chính, bạn sẽ nhìn thấy hai khu vực: khu vực nằm bên trái chứa nội dung của file tài liệu vừa mới thêm vào, khung bên phải sẽ là tài liệu sau khi trích xuất từ file ảnh. Khi phần nội dung đã được nạp xong, bạn nhấn đề mục OCR Language (góc trên bên phải màn hình) và chọn Vietnamese. Sau đó, nhấn nút OCR để bắt đầu quá trình biên dịch nội dung, tốc độ nhanh hay chậm còn tùy thuộc vào độ dài, ngắn của văn bản và tốc độ xử lý của máy tính.

Sau khi biên dịch xong, bạn sẽ có ngay phần dữ liệu dạng text, có thể xoá hay thay đổi một cách dễ dàng. Một điểm hay của VietOCR, đó là khả năng tích hợp bộ gõ tiếng Việt (hoạt động dựa trên bộ gõ Unikey), cho phép bạn dễ dàng thay đổi nội dung văn bản có dấu mà không cần bộ gõ Unikey thường trực nơi khay hệ thống. Để định bộ gõ trong VietOCR, bạn truy cập menu Settings > Viet Input Method và chọn một trong các kiểu gõ: VNI, Telex, VIQR với Font mặc định là Unicode được tích hợp sẵn. Trường hợp chỉ muốn nhận dạng riêng một khu vực nào đó, bạn giữ trái chuột và rê vào vùng văn bản mà bạn muốn trích xuất. Khi đó, chỉ nội dung của vùng này sẽ được hiển thị bên khung phải màn hình. Nếu muốn biên dịch tài liệu nhiều trang, bạn truy cập menu Command > OCR All Pages.

Để “thử” kiểm tra khả năng nhận diện văn bản của chương trình trên các định dạng khác nhau, người viết đã sử dụng thư viện mẫu văn bản có sẵn (C:\Program Files\VietUnicode\VietOCR.NET\samples) và dùng chương trình MS Paint của Windows để lưu lại thành các định dạng khác nhau như: PNG, JPG và BMP (256 bit) từ file gốc có định dạng .TIFF

Kết quả, cả ba trường hợp đều nhận dạng được văn bản khá chuẩn xác. Tuy nhiên một số dấu câu chưa đúng và một vài từ vẫn còn sai chính tả, không rõ nghĩa nhưng mức độ biên dịch so với bản gốc là khá chuẩn.

2. Cài đặt máy quét:

Nếu nhu cầu của bạn là xử lý các tài liệu bên ngoài thông qua hệ thống quét của chương trình, nhất thiết bạn phải cài đặt thêm máy quét. Để làm việc này, bạn truy cập vào thư mục cài đặt của VietOCR, tìm và sao chép file WIAAut.dll (C:\Program Files\VietUnicode\VietOCR.NET) vào thư mục C:\Windows\System32.

Sau đó, bạn vào Start > Run, gõ lệnh regsvr32 C:\Windows\System32\WIAAut.dll để đăng ký thư viện này với Windows. Khi đăng ký xong, bạn cài driver cho máy quét và bắt đầu tiến trình xử lý văn bản như trên.

Lưu ý:

- Trong quá trình biên dịch, đôi lúc bạn sẽ gặp phải thông báo lỗi Attemp to read or write protected memory, một trong những nguyên nhân gây ra lỗi này là do văn bản đã định sai hướng (lệch hướng đi, thay vì nằm ngang, văn bản đã chuyển sang hướng đứng), bạn chỉ việc nhấn nút Rotate vài lần cho đúng hướng là xong.

- Nếu không có máy quét và bạn vẫn muốn “trải nghiệm” tính năng của phần mềm, bạn có thể tải tiện ích ImagePrinter, giúp bạn chuyển đổi bất kỳ tài liệu nào sang bốn định dạng hỗ trợ sẵn của chương trình (bmp, png, tiff, jpg). Trường hợp nếu muốn chuyển giao diện chương trình sang tiếng Việt, bạn truy cập menu Settings > User Interface Language, chọn Vietnamese.

Cũng tương tự quá trình nhận dạng tài liệu ảnh ở trên, trong trường hợp này tài liệu quét sẽ được chia thành hai dạng để kiểm tra: dạng văn bản thuần (text) và văn bản kèm hình ảnh. Quá trình xử lý và biên dịch được thực hiện như bước 1. Kết quả chương trình nhận dạng tốt với các văn bản thuần và gặp phải tình trạng lỗi OCR Operation với các tài liệu có kèm hình ảnh. Việc thực hiện này cũng xảy ra với các định dạng khác.

Một điều lưu ý với các bạn, để quá trình nhận dạng ảnh được chính xác, độ phân giải của bản quét phải đạt chuẩn 300dpi, không mờ, càng sạch và rõ càng tốt.

3. Xử lý tài liệu PDF:

Ngoài khả năng nhận dạng các tài liệu ảnh, VietOCR còn có khả năng xử lý các tài liệu PDF. Để có thể sử dụng được tính năng này trong VietOCR, bạn cần cài đặt thêm gói GPL GhostScript 8.7. Sau khi cài xong, bạn thực hiện việc xử lý tương tự các bước trên (với các tài liệu PDF có chứa hình ảnh, kết quả vẫn bị lỗi như trường hợp hai).

Nhìn chung, VietOCR có khả năng xử lý văn bản tiếng Việt tốt, độ chính xác khá cao và tương thích với nhiều định dạng ảnh khác nhau trong điều kiện văn bản thuần (không chứa hình ảnh), bạn có thể dùng văn bản sau khi xử lý để phục vụ cho công việc mà không phải tốn thời gian chỉnh sửa nhiều.

Theo ECHIP