<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
 <channel>
  <title>語句ログ - ニュース、プログラミング、システムトレードの用語解説</title>
  <link>https://59log.com/</link>
  <description>日本の注目ニュース、コンピュータープログラミング（C/C++,Perl,PHP,SQL）、システムトレード（FX,CFD,株価指数,先物）に関する語句（Word）を日本語や英語で解説</description>
  <lastBuildDate>Sun, 03 May 2026 18:50:16 +0900</lastBuildDate>
  <pubDate>Sun, 03 May 2026 18:50:16 +0900</pubDate>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>59Tracker 3.2</generator>
  <item>
    <title>[Perl]UTF-8でエンコードされた文字列の文字数を取得するコード</title>
    <description>&lt;p&gt;Perlのlength関数ではバイト単位となるので、UTF-8でエンコードされている場合、漢字、ひらがな、カタカナなどは1文字で3となってしまいます。&lt;/p&gt;&lt;p&gt;ブログなどのアプリケーションのテキスト処理ではそれでは不都合な場合もことも多いので、半角英数も全角文字（漢字、ひらがな、カタカナなど）も1文字としてカウントする関数を作成することにします。&lt;/p&gt;&lt;p&gt;UTF-8では、&lt;br&gt;&lt;br&gt;1バイト目の先頭ビットが0の場合は1バイト文字&lt;br&gt;1バイト目の先頭から3ビットが110の場合は2バイト文字&lt;br&gt;1バイト目の先頭から4ビットが1110の場合は3バイト文字&lt;br&gt;1バイト目の先頭から5ビットが11110の場合は4バイト文字&lt;br&gt;1バイト目の先頭から6ビットが111110の場合は5バイト文字&lt;br&gt;1バイト目の先頭から7ビットが1111110の場合は2バイト文字&lt;br&gt;&lt;br&gt;という仕様ですので、1バイト目のビットの状態を調べることによって、その文字が何バイトかを調べることができます。&lt;br&gt;&lt;/p&gt;&lt;p&gt;以下のコードでは、この仕様にもとづいて全角文字を含む文字列の文字数を取得しています。&lt;/p&gt;&lt;p&gt;#!/usr/bin/perl&lt;br&gt;&lt;br&gt;use&amp;nbsp;strict;&lt;br&gt;use&amp;nbsp;warnings;&lt;br&gt;&lt;br&gt;my&amp;nbsp;$testAscii&amp;nbsp;=&amp;nbsp;&amp;quot;ABCDEFG&amp;quot;;&lt;br&gt;my&amp;nbsp;$testHira&amp;nbsp;&amp;nbsp;=&amp;nbsp;&amp;quot;あいうえお&amp;quot;;&lt;br&gt;my&amp;nbsp;$testKata&amp;nbsp;&amp;nbsp;=&amp;nbsp;&amp;quot;アイウエ&amp;quot;;&lt;br&gt;my&amp;nbsp;$testKanji&amp;nbsp;=&amp;nbsp;&amp;quot;愛々木&amp;quot;;&lt;br&gt;my&amp;nbsp;$testAll&amp;nbsp;=&amp;nbsp;&amp;quot;ABCDEFGあいうえおアイウエオ愛夢佐々木&amp;quot;;&lt;br&gt;&lt;br&gt;print&amp;nbsp;&amp;quot;length($testAscii)&amp;nbsp;=&amp;nbsp;&amp;quot;.length($testAscii),&amp;nbsp;&amp;quot;\n&amp;quot;;&lt;br&gt;print&amp;nbsp;&amp;quot;strlen_utf8($testAscii)&amp;nbsp;=&amp;nbsp;&amp;quot;.strlen_utf8($testAscii),&amp;nbsp;&amp;quot;\n&amp;quot;;&lt;br&gt;&lt;br&gt;print&amp;nbsp;&amp;quot;length($testHira)&amp;nbsp;=&amp;nbsp;&amp;quot;.length($testHira),&amp;nbsp;&amp;quot;\n&amp;quot;;&lt;br&gt;print&amp;nbsp;&amp;quot;strlen_utf8($testHira)&amp;nbsp;=&amp;nbsp;&amp;quot;.strlen_utf8($testHira),&amp;nbsp;&amp;quot;\n&amp;quot;;&lt;br&gt;&lt;br&gt;print&amp;nbsp;&amp;quot;length($testKata)&amp;nbsp;=&amp;nbsp;&amp;quot;.length($testKata),&amp;nbsp;&amp;quot;\n&amp;quot;;&lt;br&gt;print&amp;nbsp;&amp;quot;strlen_utf8($testKata)&amp;nbsp;=&amp;nbsp;&amp;quot;.strlen_utf8($testKata),&amp;nbsp;&amp;quot;\n&amp;quot;;&lt;br&gt;&lt;br&gt;print&amp;nbsp;&amp;quot;length($testKanji)&amp;nbsp;=&amp;nbsp;&amp;quot;.length($testKanji),&amp;nbsp;&amp;quot;\n&amp;quot;;&lt;br&gt;print&amp;nbsp;&amp;quot;strlen_utf8($testKanji)&amp;nbsp;=&amp;nbsp;&amp;quot;.strlen_utf8($testKanji),&amp;nbsp;&amp;quot;\n&amp;quot;;&lt;br&gt;&lt;br&gt;print&amp;nbsp;&amp;quot;length($testAll)&amp;nbsp;=&amp;nbsp;&amp;quot;.length($testAll),&amp;nbsp;&amp;quot;\n&amp;quot;;&lt;br&gt;print&amp;nbsp;&amp;quot;strlen_utf8($testAll)&amp;nbsp;=&amp;nbsp;&amp;quot;.strlen_utf8($testAll),&amp;nbsp;&amp;quot;\n&amp;quot;;&lt;br&gt;&lt;br&gt;exit;&lt;br&gt;&lt;br&gt;#&amp;nbsp;UTF-8でエンコードされた文字列の文字数を取得する。&lt;br&gt;sub&amp;nbsp;strlen_utf8&amp;nbsp;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;my&amp;nbsp;($text)&amp;nbsp;=&amp;nbsp;@_;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;my&amp;nbsp;$textlen&amp;nbsp;=&amp;nbsp;length($text);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;my&amp;nbsp;$pos&amp;nbsp;=&amp;nbsp;0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;my&amp;nbsp;$count&amp;nbsp;=&amp;nbsp;0;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;($pos&amp;nbsp;&amp;lt;&amp;nbsp;$textlen)&amp;nbsp;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;my&amp;nbsp;$code&amp;nbsp;=&amp;nbsp;ord&amp;nbsp;substr($text,&amp;nbsp;$pos,&amp;nbsp;1);&amp;nbsp;#&amp;nbsp;先頭のASCIIコード値を取得&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;my&amp;nbsp;$bytelen&amp;nbsp;=&amp;nbsp;_bytesize($code);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$pos&amp;nbsp;+=&amp;nbsp;$bytelen;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$count++;&amp;nbsp;#&amp;nbsp;文字数をカウント&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;$count;&lt;br&gt;}&lt;br&gt;&lt;br&gt;#&amp;nbsp;文字のバイト長を求める&lt;br&gt;sub&amp;nbsp;_bytesize&amp;nbsp;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;my&amp;nbsp;($code)&amp;nbsp;=&amp;nbsp;@_;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;my&amp;nbsp;$size&amp;nbsp;=&amp;nbsp;1;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(0x80&amp;nbsp;&amp;amp;&amp;nbsp;$code)&amp;nbsp;{&amp;nbsp;#&amp;nbsp;1バイト文字以外&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$size++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$code&amp;nbsp;&amp;lt;&amp;lt;=&amp;nbsp;1;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;my&amp;nbsp;$i&amp;nbsp;(2&amp;nbsp;..&amp;nbsp;8)&amp;nbsp;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;last&amp;nbsp;if&amp;nbsp;(!(0x80&amp;nbsp;&amp;amp;&amp;nbsp;$code));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$size++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$code&amp;nbsp;&amp;lt;&amp;lt;=&amp;nbsp;1;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;$size;&lt;br&gt;}&lt;br&gt;&lt;/p&gt;&lt;p&gt;strlen_utf8関数では、substr関数を使用して1バイト目のASCIIコード値を取得し、_bytesize関数を呼び出して文字のバイト数を求め、1文字分の処理を行うたびに文字数をカウントアップしています。&lt;/p&gt;&lt;p&gt;_bytesize関数ではパラメータで渡されたコード値の場合の文字のバイト数を、コード値のビットの状態から判定し戻り値として返しています。&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.amazon.co.jp/exec/obidos/ASIN/4774145386/aaaaaaee-22/ref=nosim&quot;&gt;ゼロからわかる Perl言語超入門&lt;/a&gt;&lt;br /&gt;&lt;small&gt;技術評論社  著者：高橋 順子  &lt;font color=&quot;#66ccff&quot;&gt;&lt;/font&gt;&lt;/small&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.amazon.co.jp/exec/obidos/ASIN/4774145386/aaaaaaee-22/ref=nosim&quot;&gt;&lt;img src=&quot;http://ecx.images-amazon.com/images/I/41cLYQHtnZL.jpg&quot; border=&quot;0&quot; &gt;&lt;/a&gt;  &lt;br clear=&quot;left&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.amazon.co.jp/exec/obidos/ASIN/4774145386/aaaaaaee-22/ref=nosim&quot; target=&quot;_blank&quot;&gt;amazon.co.jpのカスタマーレビューを見る&lt;/a&gt;&lt;br /&gt;powered by &lt;a href=&quot;http://59bbs.org/amalink/&quot;&gt;amalink&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;a href=&quot;https://59log.com/?func=detail&amp;amp;id=2243#link&quot; target=&quot;_blank&quot;&gt;Link(3)&lt;/a&gt; | &lt;a href=&quot;https://59log.com/?func=detail&amp;amp;id=2243#trackback&quot; target=&quot;_blank&quot;&gt;Trackback(0)&lt;/a&gt; | &lt;a href=&quot;https://59log.com/?func=detail&amp;amp;id=2243#comment&quot; target=&quot;_blank&quot;&gt;Comment(1)&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;h3&gt;キーワード&lt;/h3&gt;&lt;p&gt;&lt;em&gt;&lt;a href=&quot;https://59log.com/?q=Perl&quot; title=&quot;Perl&quot;&gt;Perl&lt;/a&gt;&lt;/em&gt;&amp;nbsp;&lt;em&gt;&lt;a href=&quot;https://59log.com/?q=%E6%96%87%E5%AD%97%E6%95%B0&quot; title=&quot;文字数&quot;&gt;文字数&lt;/a&gt;&lt;/em&gt;&amp;nbsp;&lt;em&gt;&lt;a href=&quot;https://59log.com/?q=%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB&quot; title=&quot;サンプル&quot;&gt;サンプル&lt;/a&gt;&lt;/em&gt;&amp;nbsp;&lt;em&gt;&lt;a href=&quot;https://59log.com/?q=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0&quot; title=&quot;プログラム&quot;&gt;プログラム&lt;/a&gt;&lt;/em&gt;&amp;nbsp;&lt;em&gt;&lt;a href=&quot;https://59log.com/?q=%E3%82%B3%E3%83%BC%E3%83%89&quot; title=&quot;コード&quot;&gt;コード&lt;/a&gt;&lt;/em&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://59log.com/&quot;&gt;語句ログ - ニュース、プログラミング、システムトレードの用語解説 - 日本の注目ニュース、コンピュータープログラミング（C/C++,Perl,PHP,SQL）、システムトレード（FX,CFD,株価指数,先物）に関する語句（Word）を日本語や英語で解説&lt;/a&gt;&lt;/p&gt;</description>
    <link>https://59log.com/?func=detail&amp;id=2243</link>
    <pubDate>Wed, 12 Dec 2012 11:56:21 +0900</pubDate>
  </item>

 </channel>
</rss>
