ThaiSEOBoard.com

พัฒนาเว็บไซต์ => Programming => ข้อความที่เริ่มโดย: puiiz_zz ที่ 05 กุมภาพันธ์ 2012, 15:13:41



หัวข้อ: การนับจำนวนตัวอักษรภาษาไทย โดย ไม่นับ สระ และ สัญลักษณ์ ต่างๆ ทำยังไงคะ
เริ่มหัวข้อโดย: puiiz_zz ที่ 05 กุมภาพันธ์ 2012, 15:13:41
ลองหาโค้ด ใน google มาทดสอบหมดแล้ว

แต่มันนับ ไม่ตรง อะคะ

เช่น พิมพ์ " ส " มันนับได้ 3 character

ลองใช้โค้ด ตามเว็บแล้ว มัน ก็ไม่ได้ ช่วยทีนะคะ

ใช้โค้ดนี้ไปคะ

http://www.it4x.com/forum/index.php/topic,8328.0.html

http://www.thaicreate.com/php/forum/036413.html

http://moshikub.com/strlen-php-%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B8%99%E0%B8%B1%E0%B8%9A%E0%B8%95%E0%B8%B1%E0%B8%A7%E0%B8%AD%E0%B8%B1%E0%B8%81%E0%B8%A9%E0%B8%A3-%E0%B9%83%E0%B8%99%E0%B8%82%E0%B9%89%E0%B8%AD%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1-string/

http://necz.net/2011/09/20/php-%E0%B8%95%E0%B8%B1%E0%B8%94%E0%B8%AD%E0%B8%B1%E0%B8%81%E0%B8%82%E0%B8%A3%E0%B8%B0%E0%B8%9E%E0%B8%B4%E0%B9%80%E0%B8%A8%E0%B8%A9/



จุดประสงค์คือต้องการจัด นับตัวอักษรทั้งหมดในข้อความ รวมทั้ง ตัวอักษรภาษาไทยด้วย
โดยจะไม่นับ สระ อะ อา อิ อี และ วรรณยุกต์ เอกโท ตรี จัตวา

และ ไม่นับ อักษรพิเศษ symbol

แต่ พอลอง ใช้โค้ดที่ได้มาในเวบแล้ว
มันนับตัวอักษรภาษาไทยผิดอะคะ แต่นับตัวอักษรอังกฤษได้ถูกต้อง

แล้วแต่ละ โค้ด การ encode ต่างกันอีก -*-

ข้อมูลที่เรียกมานับ คือข้อมูลใน ฐานข้อมูล
ซึ่งในฐานข้อมูลใช้ tis-20

แต่ในหน้า page ใช้ window874


ใครพอมีโค้ด หรือแนะนำได้บ้างคะ

ต้องใช้งานด่วนเลยช่วยที





หัวข้อ: Re: การนับจำนวนตัวอักษรภาษาไทย โดย ไม่นับ สระ และ สัญลักษณ์ ต่างๆ ทำยังไงคะ
เริ่มหัวข้อโดย: thai2ads ที่ 05 กุมภาพันธ์ 2012, 17:10:43
mb_strlen();

ตัวอย่าง
$text="ทดสอบ";
echo mb_strlen($text);


หัวข้อ: Re: การนับจำนวนตัวอักษรภาษาไทย โดย ไม่นับ สระ และ สัญลักษณ์ ต่างๆ ทำยังไงคะ
เริ่มหัวข้อโดย: MeenyFancy ที่ 05 กุมภาพันธ์ 2012, 22:03:57
เอาแบบบื้อๆ เลยนะ str_replace ก่อนครับ
โค๊ด:
<?php
$text
=" ส@#กี ";
$t2 str_replace(' ','',$text);
$t2 str_replace('ี','',$t2);
$t2 str_replace('@','',$t2);
$t2 str_replace('#','',$t2);
echo 
mb_strlen($t2);
?>

result
โค๊ด:
2


หัวข้อ: Re: การนับจำนวนตัวอักษรภาษาไทย โดย ไม่นับ สระ และ สัญลักษณ์ ต่างๆ ทำยังไงคะ
เริ่มหัวข้อโดย: Splendith ที่ 05 กุมภาพันธ์ 2012, 23:44:20
ไม่รู้ว่าผมเข้าใจถูกหรือเปล่านะครับ

อันนี้ผมเขียนโค้ดขึ้นมาแล้วทดสอบโดยฐานข้อมูลใช้ tis-620 / หน้า page ใช้ windows-874 ลองใช้แล้วไม่มีปัญหา
ผมทำแบบตัดสระและวรรณยุกต์ออกทั้งหมดนะครับ (ไม่ชัวร์ว่าที่คุณพูดว่าสระ อะ อา อิ อี นั้นตัดแค่ 4 สระหรือตัดทุกสระ เพราะเห็นหัวข้อกระทู้บอกให้ไม่นับสระ *0*)

โค๊ด:
function th_strlen($str)
{
$new = preg_replace('/[^0-9A-Za-zก-ฮ๐-๙]/','',$str); // ตัดทุกอย่างนอกเหนือขอบเขตที่ระบุไว้ทิ้ง
return strlen($new);
}

echo th_strlen("ตู้ไม้ที่บ้านเอียงจ้ะABC   123+-*#"); // ได้ 15 (นับเพียง "ตมทบนอยงจABC123" )

ถ้ามีปัญหาใดๆ บอกนะครับผม  :wanwan019:


หัวข้อ: Re: การนับจำนวนตัวอักษรภาษาไทย โดย ไม่นับ สระ และ สัญลักษณ์ ต่างๆ ทำยังไงคะ
เริ่มหัวข้อโดย: puiiz_zz ที่ 06 กุมภาพันธ์ 2012, 00:37:18
ไม่รู้ว่าผมเข้าใจถูกหรือเปล่านะครับ

อันนี้ผมเขียนโค้ดขึ้นมาแล้วทดสอบโดยฐานข้อมูลใช้ tis-620 / หน้า page ใช้ windows-874 ลองใช้แล้วไม่มีปัญหา
ผมทำแบบตัดสระและวรรณยุกต์ออกทั้งหมดนะครับ (ไม่ชัวร์ว่าที่คุณพูดว่าสระ อะ อา อิ อี นั้นตัดแค่ 4 สระหรือตัดทุกสระ เพราะเห็นหัวข้อกระทู้บอกให้ไม่นับสระ *0*)

โค๊ด:
function th_strlen($str)
{
$new = preg_replace('/[^0-9A-Za-zก-ฮ๐-๙]/','',$str); // ตัดทุกอย่างนอกเหนือขอบเขตที่ระบุไว้ทิ้ง
return strlen($new);
}

echo th_strlen("ตู้ไม้ที่บ้านเอียงจ้ะABC   123+-*#"); // ได้ 15 (นับเพียง "ตมทบนอยงจABC123" )

ถ้ามีปัญหาใดๆ บอกนะครับผม  :wanwan019:



สงสัยจะมีปัญหา กับการ Encode แน่เลยคะ    ลองโค้ดที่ให้มาใช้ได้ปกติเลย นับได้ปกติ

แต่ปัญหาที่เจอคือ พอเอาไปใช้งานจริง  ในหน้า ที่ใส่ฟังชั่น ทำการ ใส่ไว้แบบนี้

print '<meta http-equiv="Content-Type" content="text/html; charset=windows-874" />';

จากนั้น ก็ทำการ

include('../config.php');
include('../account/account.php');
mysql_query(" SET NAMES UTF8");


แล้ว พอมันไปใช้งานฟังชั่น
ก็จะให้ทำการดึงข้อมูลที่จะ นับจำนวนคำมาจากฐานข้อมูล ซึ่ง ได้มีการตั้งใส่ส่วนนี้ไว้เป็น tis-620

พอฟังชั่น นับจำนวนคำทำงาน

ลองพิมพ์แค่ตัวอักษร    "ด" = แต่มัน นับ ได้ 3 character

ใครก็ได้ช่วยที แก้ยังไงได้บ้างคะ

ลองแก้ ตรง   mysql_query(" SET NAMES UTF8");  เป็น tis620 และ windows-874  แล้ว ก็ยังนับไม่ถูกต้อง


หัวข้อ: Re: การนับจำนวนตัวอักษรภาษาไทย โดย ไม่นับ สระ และ สัญลักษณ์ ต่างๆ ทำยังไงคะ
เริ่มหัวข้อโดย: talon ที่ 06 กุมภาพันธ์ 2012, 01:26:29
เดา ๆ เอานะครับว่าเป็นเพราะใน DB เป็น UTF-8 ครับ

strlen simply counts the number of bytes in a string, not the number of characters.
This means for UTF-8 the integer it returns is actually longer than the number of characters in the string.

strlen จะนับจำนวนไบท์ ไม่ได้นับจำนวนตัวอักษร
นั่นหมายความว่า สำหรับ UTF-8 ค่าตัวเลขที่ได้รับจาก strlen จะยาวกว่า จำนวนตัวอักษร


ลองใช้ function เปลี่ยนจาก utf-8 เป็น tis-620 ก่อนครับแล้วค่อยใช้ ฟังก์ช้นของคุณ Splendith นับค่าเอาครับ

โค๊ด:
$str = th_strlen(utf8_to_tis620($str));

function th_strlen($str)
{
$new = preg_replace('/[^0-9A-Za-zก-ฮ๐-๙]/','',$str); // ตัดทุกอย่างนอกเหนือขอบเขตที่ระบุไว้ทิ้ง
return strlen($new);
}
function utf8_to_tis620($string) {
  $str = $string;
  $res = "";
  for ($i = 0; $i < strlen($str); $i++) {
    if (ord($str[$i]) == 224) {
      $unicode = ord($str[$i+2]) & 0x3F;
      $unicode |= (ord($str[$i+1]) & 0x3F) << 6;
      $unicode |= (ord($str[$i]) & 0x0F) << 12;
      $res .= chr($unicode-0x0E00+0xA0);
      $i += 2;
    } else {
      $res .= $str[$i];
    }
  }
  return $res;
}


หัวข้อ: Re: การนับจำนวนตัวอักษรภาษาไทย โดย ไม่นับ สระ และ สัญลักษณ์ ต่างๆ ทำยังไงคะ
เริ่มหัวข้อโดย: puiiz_zz ที่ 06 กุมภาพันธ์ 2012, 02:25:50
เดา ๆ เอานะครับว่าเป็นเพราะใน DB เป็น UTF-8 ครับ

strlen simply counts the number of bytes in a string, not the number of characters.
This means for UTF-8 the integer it returns is actually longer than the number of characters in the string.

strlen จะนับจำนวนไบท์ ไม่ได้นับจำนวนตัวอักษร
นั่นหมายความว่า สำหรับ UTF-8 ค่าตัวเลขที่ได้รับจาก strlen จะยาวกว่า จำนวนตัวอักษร


ลองใช้ function เปลี่ยนจาก utf-8 เป็น tis-620 ก่อนครับแล้วค่อยใช้ ฟังก์ช้นของคุณ Splendith นับค่าเอาครับ

โค๊ด:
$str = th_strlen(utf8_to_tis620($str));

function th_strlen($str)
{
$new = preg_replace('/[^0-9A-Za-zก-ฮ๐-๙]/','',$str); // ตัดทุกอย่างนอกเหนือขอบเขตที่ระบุไว้ทิ้ง
return strlen($new);
}
function utf8_to_tis620($string) {
  $str = $string;
  $res = "";
  for ($i = 0; $i < strlen($str); $i++) {
    if (ord($str[$i]) == 224) {
      $unicode = ord($str[$i+2]) & 0x3F;
      $unicode |= (ord($str[$i+1]) & 0x3F) << 6;
      $unicode |= (ord($str[$i]) & 0x0F) << 12;
      $res .= chr($unicode-0x0E00+0xA0);
      $i += 2;
    } else {
      $res .= $str[$i];
    }
  }
  return $res;
}

ข้อมูลใน DB มันเป็น Tis-620 อยู่แล้วนะคะ
แต่ หน้าที่ ใช้งานฟังชั่น


include('../config.php');
include('../account/account.php');
mysql_query(" SET NAMES UTF8");


ถ้าลองเปลี่ยนจาก  SET NAMES TIS620  ค่าที่ได้มันเปลี่ยนไป คะ มันเพิ่มขึ้นเป็น 8 9 char บางที อ่านไม่ออกเลย


หัวข้อ: Re: การนับจำนวนตัวอักษรภาษาไทย โดย ไม่นับ สระ และ สัญลักษณ์ ต่างๆ ทำยังไงคะ
เริ่มหัวข้อโดย: WPDSign ที่ 06 กุมภาพันธ์ 2012, 02:45:47
ขอเก็บความรู้ครับ เดี่ยวว่างๆมาอ่าน อ่านได้นิดเริ่มลึก


หัวข้อ: Re: การนับจำนวนตัวอักษรภาษาไทย โดย ไม่นับ สระ และ สัญลักษณ์ ต่างๆ ทำยังไงคะ
เริ่มหัวข้อโดย: talon ที่ 06 กุมภาพันธ์ 2012, 03:00:23
ไฟล์ php ของคุณ save ด้วย utf8 format ครับ
ถ้าเปลี่ยน save เป็น ANSI จะใช้ function strlen ได้ตามปกติ

หรือถ้าอยากใช้ utf8 เหมือนเดิม ก็เอาฟังก์ช้นใน rep ที่แล้วของผมมาใช้ครับ
ตะกี๊ทดสอบแล้ว ใช้ได้แน่นอน


หัวข้อ: Re: การนับจำนวนตัวอักษรภาษาไทย โดย ไม่นับ สระ และ สัญลักษณ์ ต่างๆ ทำยังไงคะ
เริ่มหัวข้อโดย: puiiz_zz ที่ 06 กุมภาพันธ์ 2012, 04:13:57
ไฟล์ php ของคุณ save ด้วย utf8 format ครับ
ถ้าเปลี่ยน save เป็น ANSI จะใช้ function strlen ได้ตามปกติ

หรือถ้าอยากใช้ utf8 เหมือนเดิม ก็เอาฟังก์ช้นใน rep ที่แล้วของผมมาใช้ครับ
ตะกี๊ทดสอบแล้ว ใช้ได้แน่นอน


โค๊ด:

<?php
set_time_limit
(0);

ob_start();
error_reporting (E_ALL E_NOTICE E_DEPRECATED); 


header("Last-Modified: " gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0"false);
header("Pragma: no-cache");

//print '<meta http-equiv="Content-Type" content="text/html; charset=windows-874" />';
//print '<meta http-equiv="Content-Type" content="text/html; charset=tis-620"/> ';
print '<meta http-equiv="Content-Type" content="text/html; charset=UTF8" />';

mysql_query(" SET NAMES UTF8");

function checkPost($message,$allMessageWords )
{
$msgLength = strlenth($str);
}



function 
strlenth($str)
{
$arr str_split($str);
$count 0;
foreach(
$arr as $val)
{
$ascii ord($val);
if(!( 
$ascii == 209 || ($ascii >= 212 && $ascii <= 218 ) || ($ascii >= 231 && $ascii <= 238 )))
$count += 1;
}
return 
$count;
}

?>



ช่วยดูให้ทีคะ  โค้ดเป็นแบบนี้  ตอนนี้มันก็ยังไม่ได้


หัวข้อ: Re: การนับจำนวนตัวอักษรภาษาไทย โดย ไม่นับ สระ และ สัญลักษณ์ ต่างๆ ทำยังไงคะ
เริ่มหัวข้อโดย: aek26 ที่ 06 กุมภาพันธ์ 2012, 08:19:15
เยี่ยมครับ ขอมาร์ไว้หน่อยครับ


หัวข้อ: Re: การนับจำนวนตัวอักษรภาษาไทย โดย ไม่นับ สระ และ สัญลักษณ์ ต่างๆ ทำยังไงคะ
เริ่มหัวข้อโดย: Splendith ที่ 06 กุมภาพันธ์ 2012, 12:46:49
ขอโค้ดตอนคุณเรียกข้อมูลจากฐานข้อมูลทีครับ แล้วเวลา echo ข้อมูลออกมาเป็นภาษาต่างดาวหรือปกติครับ
ดูโค้ดที่ให้มาแล้วงงๆ ไม่รู้ว่าอยู่ส่วนไหนของโปรแกรม  :P

คำสั่ง mysql_query("SET NAMES UTF8");
ต้องใช้หลังคำสั่ง mysql_connect นะครับ

ถ้าใช้ UTF8 โค้ดฟังชั่นก็จะประมาณนี้
โค๊ด:
function th_strlen($str)
{
$new = preg_replace('/[^0-9A-Za-zก-ฮ๐-๙]/u','',$str); // ตัดทุกอย่างนอกเหนือขอบเขตที่ระบุไว้ทิ้ง
return mb_strlen($new, 'UTF8');
}

อันนี้คือตัวอย่างไฟล์เต็มๆ ที่ผมลองแล้วปกติครับ

โค๊ด:
<?

echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';

//-------------- อาจอยู่ใน config.php -------------------
mysql_connect("localhost","---","---");
mysql_select_db("---");
mysql_query("SET NAMES UTF8");

//-------------- อาจอยู่ในไฟล์อื่น -------------------------
function th_strlen($str)
{
$new = preg_replace('/[^0-9A-Za-zก-ฮ๐-๙]/u','',$str); // ตัดทุกอย่างนอกเหนือขอบเขตที่ระบุไว้ทิ้ง
return mb_strlen($new, 'UTF8');
}
//-----------------------------------------------------

$r = mysql_result(mysql_query("SELECT * FROM test"),0); // ดึงข้อความจากฐานข้อมูล
echo th_strlen($r);

?>


หัวข้อ: Re: การนับจำนวนตัวอักษรภาษาไทย โดย ไม่นับ 
เริ่มหัวข้อโดย: talon ที่ 06 กุมภาพันธ์ 2012, 13:03:11
ไม่เกี่ยวกับข้อมูลใน DB ครับ
แต่เป็นการ save file script ของคุณ ซึ่งตอนที่คุณแก้ไขไฟล์ php script นั้น คุณ save เป็น utf-8 format
ซึ่งมีผลทำให้ function strlen เพี้ยน

วิธีแก้ก็เพิ่ม function ตามโค้ดข้างล่างนี่ครับ

โค๊ด:
<?php
set_time_limit
(0);

ob_start();
error_reporting (E_ALL E_NOTICE E_DEPRECATED); 


header("Last-Modified: " gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0"false);
header("Pragma: no-cache");

//print '<meta http-equiv="Content-Type" content="text/html; charset=windows-874" />';
//print '<meta http-equiv="Content-Type" content="text/html; charset=tis-620"/> ';
print '<meta http-equiv="Content-Type" content="text/html; charset=UTF8" />';

mysql_query(" SET NAMES UTF8");

function checkPost($message,$allMessageWords )
{
$msgLength = strlenth(utf8_to_tis620($str));
}
function 
utf8_to_tis620($string) {
  
$str $string;
  
$res "";
  for (
$i 0$i strlen($str); $i++) {
    if (
ord($str[$i]) == 224) {
      
$unicode ord($str[$i+2]) & 0x3F;
      
$unicode |= (ord($str[$i+1]) & 0x3F) << 6;
      
$unicode |= (ord($str[$i]) & 0x0F) << 12;
      
$res .= chr($unicode-0x0E00+0xA0);
      
$i += 2;
    } else {
      
$res .= $str[$i];
    }
  }
  return 
$res;
}


function 
strlenth($str)
{
$arr str_split($str);
$count 0;
foreach(
$arr as $val)
{
$ascii ord($val);
if(!( 
$ascii == 209 || ($ascii >= 212 && $ascii <= 218 ) || ($ascii >= 231 && $ascii <= 238 )))
$count += 1;
}
return 
$count;
}

?>




หัวข้อ: Re: การนับจำนวนตัวอักษรภาษาไทย โดย ไม่นับ สระ และ สัญลักษณ์ ต่างๆ ทำยังไงคะ
เริ่มหัวข้อโดย: talon ที่ 06 กุมภาพันธ์ 2012, 13:08:39
ออกตัวก่อนนะครับ ว่าไม่ได้เก่ง coding แค่พอรู้งู ๆ ปลา ๆ

เผอิญเคยอ่านเจอว่า การ save file เป็น utf8 จะำทำให้ขนาดไฟล์ใหญ่ขึ้น
เพราะ file  utf8 ใช้จำนวนไบท์ในการเก็บมากกว่า file แบบ ANSI 
มันก็เลยเอะใจน่ะครับ

ส่วน coding ที่เห็น ผมก็ถามอากู๋เอาทั้งนั้นแหละครับ แหะ ๆ ๆ


หัวข้อ: Re: การนับจำนวนตัวอักษรภาษาไทย โดย ไม่นับ สระ และ สัญลักษณ์ ต่างๆ ทำยังไงคะ
เริ่มหัวข้อโดย: puiiz_zz ที่ 06 กุมภาพันธ์ 2012, 18:19:15
ออกตัวก่อนนะครับ ว่าไม่ได้เก่ง coding แค่พอรู้งู ๆ ปลา ๆ

เผอิญเคยอ่านเจอว่า การ save file เป็น utf8 จะำทำให้ขนาดไฟล์ใหญ่ขึ้น
เพราะ file  utf8 ใช้จำนวนไบท์ในการเก็บมากกว่า file แบบ ANSI 
มันก็เลยเอะใจน่ะครับ

ส่วน coding ที่เห็น ผมก็ถามอากู๋เอาทั้งนั้นแหละครับ แหะ ๆ ๆ

คุณ talon เก่งมากๆเลยคะ

นั่งแก้ นั่งงม ตั้งนานคุณทำแปปเดียวได้ -*-


โดยวิธีแก้เป็นดังนี้คะ



ปกติ strlen() ถ้าจะใช้กับ string ที่เป็น utf8 จะต้องนำมา convert เป็น 
tis620 ด้วยฟังก์ชัน utf8_to_tis620()

ปัญหาในเคสนี้คือ  query เป็น UTF8 ด้วย mysql_query(" SET NAMES UTF8");
 
มันก็เลยเก็บค่าเป็น utf8 ไว้ ก็เลยต้องแก้ด้วยการ convert กลับมาเป็น Tis620 
ก่อน แล้วค่อยใช้ strlen() นับจำนวน
 

เป็นแนวทางเผื่อใครเจอปัญหาเหมือนกัน

^^ และสุดท้ายขอบคุณ Thaiseoboard และทุกคอมเม้นมากคะโดยเฉพาะคุณ talon


หัวข้อ: Re: การนับจำนวนตัวอักษรภาษาไทย โดย ไม่นับ สระ และ สัญลักษณ์ ต่างๆ ทำยังไงคะ
เริ่มหัวข้อโดย: Splendith ที่ 06 กุมภาพันธ์ 2012, 19:11:07
ยินดีด้วยครับที่แก้ปัญหาได้แล้ว  :)

แต่สิ่งที่ผมสงสัยอยู่คือ
ทำไมในครั้งแรกๆ ใช้ mysql_query(" SET NAMES TIS620"); บวกกับฐานข้อมูลที่ใช้ TIS620 และการแสดงผลเว็บ windows-874
แล้วทำไมถึงใช้ strlen ไม่ได้ หรือเป็นเพราะไฟล์ที่ encoding เป็น utf8 เท่านั้น


และอีกข้อหนึ่งคือ
อ้างถึง
ปัญหาในเคสนี้คือ  query เป็น UTF8 ด้วย mysql_query(" SET NAMES UTF8");

ที่ผมสงสัยคือทำไม mb_strlen(,"UTF8"); ถึงใช้งานไม่ได้ เพราะ mb_strlen มันใช้นับ Multibyte Charset ในตัวมันอยู่แล้ว

ใครรู้ตอบด้วยนะคร้าบ ขอบคุณครับ  :wanwan017:



หัวข้อ: Re: การนับจำนวนตัวอักษรภาษาไทย โดย ไม่นับ สระ และ สัญลักษณ์ ต่างๆ ทำยังไงคะ
เริ่มหัวข้อโดย: DigitalM ที่ 01 ตุลาคม 2017, 00:54:53
 :wanwan017: :wanwan017: :wanwan017: