티스토리 뷰

반응형

가끔 규격에 맞춰 데이터를 출력하려 할때 각 컬럼의 구간길이 만큼 공백을 채워야 하는 경우가 발생한다.


이번에 판매대행자료를 출력하는데, 공기관에서 다음과 같은 형태의 자료를 요청을 한다..


HD20154129201601311234567890테스트                                  2015100120151231                                                                                                                                                  

RD20154123456789000000011234567890*************홍길동              26203       201510 00000400000000000000000000000000060000000000000006000026203               010255555057 0101234525aa@koramgame.com                        A     

RD20154123456789000000021234567890*************홍길동              26203       201510 00000300000000000000000000000000009900000000000000990026203               010255555057 0101234525aa@koramgame.com                        C     

RD20154123456789000000031234567890*************홍길동              71455       201510 00000100000000000000000000000000002200000000000000220071455               010255555909 0101234502aamin_exe@kr.chu.com                    C     

RD20154123456789000000041234567890*************홍길동              16086       201510 00008100000000000000000000000000053460000000000005346016086               010255555337 0101234537aalp@ktmusic.co.kr                      A     

RD20154123456789000000011234567890*************홍길동              71455       201511 00000200000000000000000000000000004400000000000000440071455               010255555909 0101234502aamin_exe@kr.chukong.com                C     

RD20154123456789000000021234567890*************홍길동              16086       201511 00008600000000000000000000000000056760000000000005676016086               010255555337 0101234537aalp@music.co.kr                        A     

RD20154123456789000000011234567890*************홍길동              16086       201512 00011300000000000000000000000000074580000000000007458016086               010255555337 0101275337aalp@music.co.kr                        A     

TD201541234567890000000007000000290000000000000000000000000002613000000000000261300000018452000000015214520                                                                                                                          


이게 도대체 뭐임...


상호명과 함께 총 40바이트 길이를 맞춰야 하는데,

한글을 2byte 로 나머지는 공백으로 채워야 한다고 할 때.


한글 2바이트 계산이야 mb_strlen("굿바이", "euc-kr") 로 계산하면 되고 

나머지 길이만큼 str_repeat(' ', 나머지 길이 ) 로 하면 되지 않을까~ 룰루랄라 


$string = '굿바이';

$string_len = mb_strlen($string, 'euc-kr');

$string .= str_repeat(' ', 40-$string_len);


echo $string; 

결과는? 



'굿바이 ' 

눈에 보이는것에 속지말자 ㅠ HTML 상에서는 <pre>를 붙이지 않으면 중복된 공백이 무시된다.

 소스보기하면 공백과 함께 보인다!


'굿바이                                   '


그런데 공백이 35개가 나온다.

왜일까?


echo mb_strlen('굿바이', 'euc-kr');

결과가 5이다.

echo mb_strlen('테스트', 'euc-kr');

결과가 6이다.


그렇다면 일반 strlen 으로는 어떻게 나올까?


echo strlen('굿바이');

결과가 9이다.

echo strlen('테스트');

결과가 9이다.

str_pad 함수 또한 strlen 과 동일하게 계산되서 공백이 31개가 나온다. 


아직 mb_strlen 이 왜 저렇게 나오는것인지 정확한 원인을 찾지는 못했지만

그냥 직접 만들기로 했다. 


function mb_str_pad($input, $pad_length, $pad_string){


$strlen = strlen($input);

$hanlen = 0; $englen = 0;

for($i=0; $i<$strlen; $i++)

{

if(ord($input[$i]) > 127)

{

//한글 카운트

$hanlen++;

}

else

{

//한글 이외 문자 카운트

$englen++;

}

//echo "{$i}({$input[$i]})  : ". ord($input[$i])." <br/>";

}


$hanlen = ($hanlen / 3) * 2; //한글은 아스키코드 3자리로 나옴. * 한글은 2byte

$length=$hanlen + $englen;


return $input.str_repeat($pad_string, $pad_length - $length);

}


$aa = mb_str_pad("굿바이", 40, ' ');

echo $aa;


결과는 입력 한글 + 공백 34



반응형

'Develope > PHP' 카테고리의 다른 글

PHP D-Day 구하기  (0) 2018.07.02
PHP 비동기 처리하기  (2) 2018.05.20
모바일 웹뷰를 빠르게 jquery.lazyload 적용하기  (0) 2017.07.06
PHP 이메일 주소 유효성 체크하기  (0) 2016.08.22
Javascript json_decode  (0) 2016.07.14
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함