Etc
[Codeigniter4]헬퍼 함수 중 dd() 버그 아닌 버그
옥수수빵
2026. 6. 4. 18:06
728x90

위 이미지를 보면 utm_term 컬럼엔 화살표가 붙어서 아래로 떨어집니다.
보통 \n 이 값이 있으면 자동으로 이미지처럼 화살표를 붙이는데 지금 같은 경우는 그런 게 없는데도 화살표가 붙었네요.
dd() 는 내부적으로 Kint 라이브러리를 사용하고 있으며, RichRenderer::renderTab() 에 아래 코드가 있습니다. 아래 링크로 가셔서 561번째 줄을 보면 됩니다.
<?php
if (\preg_match('/(:?[\\r\\n\\t\\f\\v]| {2})/', $rep->getValue())) {
$show_contents = true;
}
개행 문자나 연속 공백이 있으면 자동으로 펼치는 로직인데, 문제는 이 정규식이 멀티바이트를 고려하지 않고 바이트 단위로 검사한다는 것이다.
$bytes = unpack('C*', '테');
// 결과: [237, 133, 140]
// 16진수: [0xED, 0x85, 0x8C]
두 번째 바이트 0x85가 유니코드 NEL (Next Line, U+0085) 과 값이 동일합니다.
Kint가 바이트 단위로 정규식을 돌리다가 이걸 개행 문자로 착각해서 펼치는 것 같네요.
"테"로 시작하는 글자들 중에 "테", "텐", "텔", "템" 등 모두 해당될 것으로 생각됩니다.
두 번째 바이트가 개행 관련 값과 겹치는 다른 글자들도 존재할 수 있어 보입니다.
Kint의 멀티바이트 문자열 처리 버그. preg_match 에 /u 플래그(유니코드 모드)를 사용했다면 발생하지 않았을 문제다라고 여겨지지만 잘 모르겠습니다.
예, 뻘짓이었습니다.
반응형