지금까지 개발하면서 mb_strlen 과 Javascript의 길이가 다를 수 있다는걸 인지하지 못하였다. 아무래도 서버단에서만 체크하다보니 디테일한 부분은 인지를 못했던것같다. 

 

보통 우리가 javascript로 글자수를 판별할 시에는 아래와 같이 `변수.length`와 같이 판별을 할것이다. 

<script>
var a = "한글 입니다.";
alert(a.length);
</script>

 

위의 소스코드를 실행 하면 7이라는 alert 결과값을 얻을 수 있다. 자바스크립트는 정확하게 글자수를 체크하기때문에 문제가 되지 않지만 서버의 경우는 개행 문자(줄바꿈)에 대해 서버마다 받아들이는게 다르기때문에 줄바꿈이 있는 텍스트의 경우 mb_strlen으로 체크하면 javascript와는 글자수가 다르게 나온다. 

 

그 예제로는 아래와 같다. 

<?php 
$txt = "한글은
아주 많은 사람들로 부터 지금까지 사랑을 받았다.";

echo '<pre>'.$txt.'</pre>';
echo "<h1>PHP mb_strlen ==> ".mb_strlen($txt, "utf-8")."</h1>";
echo '<br>';
echo "<h1>javascript length ==> <span id='result'></span></h1>";
?>
<textarea id="txt" style="display:none;"><?php echo $txt; ?></textarea>

<script>
var txt = document.getElementById('txt').value;
document.getElementById('result').innerHTML = txt.length;
</script>

 

| 결과

한글은
아주 많은 사람들로 부터 지금까지 사랑을 받았다.
PHP mb_strlen ==> 32
javascript length ==> 31

 

위의 결과를 보면 글자수가 1이 차이나는걸 알 수 있다. 텍스트의 경우 개행문자(줄바꿈)가 많을 시 더 큰 차이가 발생된다. 즉 개행문자 1개당 1씩 차이가 난다고 보면 된다. 이는 개행문자 처리가 PHP 에서는 `\r\n`(서버 OS 계열에 따라 다를 수 있음)으로 처리되고 javascript 에서는 `\n` 으로 처리되기 때문에 글자수가 개행문자당 1씩 차이가 발생되게 된다. 

 

따라서 이와 같은 차이를 없애기 위해서는 당연하게도 PHP에서 아래와 같은 방법으로 처리를 해주어야 한다. 

<?php 
$txt = "한글은
아주 많은 사람들로 부터 지금까지 사랑을 받았다.";
$txt = str_replace("\r\n","\n",$txt);

echo '<pre>'.$txt.'</pre>';
echo "<h1>PHP mb_strlen ==> ".mb_strlen($txt, "utf-8")."</h1>";
echo '<br>';
echo "<h1>javascript length ==> <span id='result'></span></h1>";
?>
<textarea id="txt" style="display:none;"><?php echo $txt; ?></textarea>

<script>
var txt = document.getElementById('txt').value;
document.getElementById('result').innerHTML = txt.length;
</script>

 

| 결과

한글은
아주 많은 사람들로 부터 지금까지 사랑을 받았다.
PHP mb_strlen ==> 31
javascript length ==> 31

 

물론 PHP에서 아래와 같이  PHP_EOL이나 \n으로 처리해도 동일하게 처리할 수 있으나 주로 우리가 작업하는건 클라이언트에서 작성된 코드를 서버단으로 전송하기 때문에 치환해주는 방법으로 예제를 보여주었다.

$txt = "한글은".PHP_EOL."아주 많은 사람들로 부터 지금까지 사랑을 받았다.";
// 또는 
$txt = "한글은\n아주 많은 사람들로 부터 지금까지 사랑을 받았다.";

 

이번 포스팅은 나혼자 알고 가도 되는 사항이지만 혹시나 나와 같이 PHP mb_strlen 의 길이와 javascript의 길이가 다를 경우 삽질하지 않기 위해 포스팅을 작성하였다.