精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

PHP 源碼探秘 - 為什么 trim 會導致亂碼

新聞 后端
本文通過對PHP源碼的探秘,揭示了 trim 會導致亂碼的原因。

[[206885]]

運行以下代碼:

$tag = '互聯網產品、';
$text = rtrim($tag, "、");
print_r($text);

運行,我們可能以為會得到的結果是 互聯網產品 ,實際結果是 互聯網產� 。為什么會這樣呢?

原理

trim 函數文檔

string trim ( string $str [, string $character_mask = " \t\n\r\0\x0B" ] )

該函數不是多字節函數,也就是說,漢字這樣的多字節字符,會拿其頭或尾的單字節來和后面的 $character_mask 對應的char數組進行匹配,如果在后面的數組中,則刪掉,繼續匹配。比如:

echo ltrim("bcdf","abc"); // df

如下面的 demo 中的函數 string_print_char 所示:

、 由 0xe3 0x80 0x81 三字節組成,

品 由 0xe5 0x93 0x81 三字節組成。

所以在執行 rtrim 的時候,通過字節比對,會將 0x81 去掉,導致了***出現了亂碼。

源碼精簡版演示

查看 PHP7 的源碼,然后提煉出下面的小 demo ,方便大家一起學習,其實PHP源碼的學習并不難,每天進步一點點。

//
//  main.c
//  trim
//
//  Created by 周夢康 on 2017/10/18.
//  Copyright © 2017年 周夢康. All rights reserved.
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void string_print_char(char *str);
void php_charmask(unsigned char *input, size_t len, char *mask);
char *ltrim(char *str,char *character_mask);
char *rtrim(char *str,char *character_mask);


int main(int argc, char const *argv[])
{
    printf("%s\n",ltrim("bcdf","abc"));
    
    string_print_char("品"); // e5    93    81
    string_print_char("、"); // e3    80    81
    
    printf("%s\n",rtrim("互聯網產品、","、"));
    
    
    return 0;
}

char *ltrim(char *str,char *character_mask)
{
    char *res;
    char mask[256];
    register size_t i;
    int trimmed = 0;
    
    size_t len = strlen(str);
    
    php_charmask((unsigned char*)character_mask, strlen(character_mask), mask);
    
    for (i = 0; i < len; i++) {
        if (mask[(unsigned char)str[i]]) {
            trimmed++;
        } else {
            break;
        }
    }
    
    len -= trimmed;
    str += trimmed;
    
    res = (char *) malloc(sizeof(char) * (len+1));
    memcpy(res,str,len);
    
    return res;
}

char *rtrim(char *str,char *character_mask)
{
    char *res;
    char mask[256];
    register size_t i;
    
    size_t len = strlen(str);
    
    php_charmask((unsigned char*)character_mask, strlen(character_mask), mask);
    
    if (len > 0) {
        i = len - 1;
        do {
            if (mask[(unsigned char)str[i]]) {
                len--;
            } else {
                break;
            }
        } while (i-- != 0);
    }
    
    res = (char *) malloc(sizeof(char) * (len+1));
    memcpy(res,str,len);
    
    return res;
}

void string_print_char(char *str)
{
    unsigned long l = strlen(str);
    
    for (int i=0; i < l; i++) {
        printf("%02hhx\t",str[i]);
    }
    
    printf("\n");
}

void php_charmask(unsigned char *input, size_t len, char *mask)
{
    unsigned char *end;
    unsigned char c;
    
    memset(mask, 0, 256);
    
    for (end = input+len; input < end; input++) {
        c = *input;
        mask[c]= 1;
    }
}

PHP7 相關源碼

PHP_FUNCTION(trim)
{
    php_do_trim(INTERNAL_FUNCTION_PARAM_PASSTHRU, 3);
}
PHP_FUNCTION(rtrim)
{
    php_do_trim(INTERNAL_FUNCTION_PARAM_PASSTHRU, 2);
}
PHP_FUNCTION(ltrim)
{
    php_do_trim(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
}
static void php_do_trim(INTERNAL_FUNCTION_PARAMETERS, int mode)
{
    zend_string *str;
    zend_string *what = NULL;

    ZEND_PARSE_PARAMETERS_START(1, 2)
        Z_PARAM_STR(str)
        Z_PARAM_OPTIONAL
        Z_PARAM_STR(what)
    ZEND_PARSE_PARAMETERS_END();

    ZVAL_STR(return_value, php_trim(str, (what ? ZSTR_VAL(what) : NULL), (what ? ZSTR_LEN(what) : 0), mode));
}
PHPAPI zend_string *php_trim(zend_string *str, char *what, size_t what_len, int mode)
{
    const char *c = ZSTR_VAL(str);
    size_t len = ZSTR_LEN(str);
    register size_t i;
    size_t trimmed = 0;
    char mask[256];

    if (what) {
        if (what_len == 1) {
            char p = *what;
            if (mode & 1) {
                for (i = 0; i < len; i++) {
                    if (c[i] == p) {
                        trimmed++;
                    } else {
                        break;
                    }
                }
                len -= trimmed;
                c += trimmed;
            }
            if (mode & 2) {
                if (len > 0) {
                    i = len - 1;
                    do {
                        if (c[i] == p) {
                            len--;
                        } else {
                            break;
                        }
                    } while (i-- != 0);
                }
            }
        } else {
            php_charmask((unsigned char*)what, what_len, mask);

            if (mode & 1) {
                for (i = 0; i < len; i++) {
                    if (mask[(unsigned char)c[i]]) {
                        trimmed++;
                    } else {
                        break;
                    }
                }
                len -= trimmed;
                c += trimmed;
            }
            if (mode & 2) {
                if (len > 0) {
                    i = len - 1;
                    do {
                        if (mask[(unsigned char)c[i]]) {
                            len--;
                        } else {
                            break;
                        }
                    } while (i-- != 0);
                }
            }
        }
    } else {
        if (mode & 1) {
            for (i = 0; i < len; i++) {
                if ((unsigned char)c[i] <= ' ' &&
                    (c[i] == ' ' || c[i] == '\n' || c[i] == '\r' || c[i] == '\t' || c[i] == '\v' || c[i] == '\0')) {
                    trimmed++;
                } else {
                    break;
                }
            }
            len -= trimmed;
            c += trimmed;
        }
        if (mode & 2) {
            if (len > 0) {
                i = len - 1;
                do {
                    if ((unsigned char)c[i] <= ' ' &&
                        (c[i] == ' ' || c[i] == '\n' || c[i] == '\r' || c[i] == '\t' || c[i] == '\v' || c[i] == '\0')) {
                        len--;
                    } else {
                        break;
                    }
                } while (i-- != 0);
            }
        }
    }

    if (ZSTR_LEN(str) == len) {
        return zend_string_copy(str);
    } else {
        return zend_string_init(c, len, 0);
    }
}
/* {{{ php_charmask
 * Fills a 256-byte bytemask with input. You can specify a range like 'a..z',
 * it needs to be incrementing.
 * Returns: FAILURE/SUCCESS whether the input was correct (i.e. no range errors)
 */
static inline int php_charmask(unsigned char *input, size_t len, char *mask)
{
    unsigned char *end;
    unsigned char c;
    int result = SUCCESS;

    memset(mask, 0, 256);
    for (end = input+len; input < end; input++) {
        c=*input;
        if ((input+3 < end) && input[1] == '.' && input[2] == '.'
                && input[3] >= c) {
            memset(mask+c, 1, input[3] - c + 1);
            input+=3;
        } else if ((input+1 < end) && input[0] == '.' && input[1] == '.') {
            /* Error, try to be as helpful as possible:
               (a range ending/starting with '.' won't be captured here) */
            if (end-len >= input) { /* there was no 'left' char */
                php_error_docref(NULL, E_WARNING, "Invalid '..'-range, no character to the left of '..'");
                result = FAILURE;
                continue;
            }
            if (input+2 >= end) { /* there is no 'right' char */
                php_error_docref(NULL, E_WARNING, "Invalid '..'-range, no character to the right of '..'");
                result = FAILURE;
                continue;
            }
            if (input[-1] > input[2]) { /* wrong order */
                php_error_docref(NULL, E_WARNING, "Invalid '..'-range, '..'-range needs to be incrementing");
                result = FAILURE;
                continue;
            }
            /* FIXME: better error (a..b..c is the only left possibility?) */
            php_error_docref(NULL, E_WARNING, "Invalid '..'-range");
            result = FAILURE;
            continue;
        } else {
            mask[c]=1;
        }
    }
    return result;
}
/* }}} */
責任編輯:張燕妮 來源: 周夢康的博客
相關推薦

2020-10-15 09:35:27

亂碼UTF-8GBK

2024-07-18 20:18:51

2017-01-05 18:43:58

閏秒Linux服務器

2024-05-27 08:04:41

2024-05-27 08:01:15

2009-07-20 10:34:44

2021-08-10 09:58:59

ThreadLocal內存泄漏

2012-08-17 10:01:07

云計算

2020-03-30 15:05:46

Kafka消息數據

2012-03-26 10:26:43

openstackeucalyptus

2012-05-02 10:08:51

桌面Linux微軟

2021-07-09 09:24:06

NanoID UUID軟件開發

2021-01-25 07:14:53

Cloud DevOps云計算

2022-04-13 20:53:15

Spring事務管理

2014-03-05 14:58:00

蘋果CarPlayiOS

2023-03-22 09:10:18

IT文檔語言

2015-12-07 10:49:43

卸載App用戶體驗

2022-05-11 08:22:54

IO負載NFSOS

2020-07-23 08:21:25

PHP開發人員MVC

2023-05-06 11:05:12

點贊
收藏

51CTO技術棧公眾號

亚洲欧美日韩在线观看a三区| 色成人免费网站| 懂色av一区二区在线播放| 欧美激情一级精品国产| 欧洲熟妇的性久久久久久| sis001亚洲原创区| 久久精品夜夜夜夜久久| 成人福利网站在线观看11| 国产亚洲精品久久777777| 免费久久精品| 91麻豆精品国产| 国自产拍偷拍精品啪啪一区二区| 国产福利小视频在线| 国产精品66部| 国产成人一区三区| 国产一区二区播放| 自拍偷拍精品| 欧美成人精品二区三区99精品| 久久精品香蕉视频| 91一区二区三区在线| 久久久久国产成人精品亚洲午夜| 91色视频在线观看| 日本久久综合网| 欧美精品偷拍| 在线免费看av不卡| 内射中出日韩无国产剧情| 国产精品一区二区三区四区在线观看| 欧美日韩国产中字| www国产免费| av基地在线| 99久久精品国产毛片| 91网站免费看| 在线免费观看一级片| 久久精品麻豆| 国内精品久久久久久中文字幕 | 99视频在线看| 五月天久久网站| 亚洲无av在线中文字幕| 亚洲久久久久久| 亚洲视频国产精品| 在线不卡的av| 激情 小说 亚洲 图片: 伦| 人狥杂交一区欧美二区| 亚洲成a人片在线观看中文| 激情图片qvod| 欧美三级黄网| 中文字幕视频一区二区三区久| 牛人盗摄一区二区三区视频| 四虎永久在线精品免费网址| 国产成+人+日韩+欧美+亚洲| 成人欧美在线视频| 一级做a爱片久久毛片| 免费日本视频一区| 国产欧美日韩丝袜精品一区| 在线观看视频中文字幕| 看电视剧不卡顿的网站| 成人国产精品一区| 国产精品高潮呻吟AV无码| 久久国产日韩欧美精品| 国产在线98福利播放视频| 伊人久久国产精品| 精品中文字幕一区二区| 成人免费福利视频| 亚洲va久久久噜噜噜无码久久| 国产剧情一区二区| 97se亚洲综合| 午夜精品久久久久久久第一页按摩 | 日韩精品三区| 欧美性大战久久久久久久蜜臀 | 校园春色 亚洲| 你懂的国产精品永久在线| 欧美日本亚洲视频| 日本少妇做爰全过程毛片| 国产日韩欧美| 国产精品久久久91| 国产精品久久久久久免费| 国产精品综合在线视频| 国产伦精品一区二区三区四区免费| 欧美熟女一区二区| 久久久久99精品一区| 夜夜爽99久久国产综合精品女不卡 | 精品中文字幕一区二区| 91九色露脸| 性插视频在线观看| 日本一区二区三区四区| 精品美女国产在线| 国产精品激情自拍| 一级黄色小视频| 国产精品69毛片高清亚洲| 国产伦精品一区二区三区四区免费 | 欧美网站在线观看| 午夜激情av在线| 亚洲3区在线| 精品亚洲国产成av人片传媒| av免费播放网站| 欧美一区二区三区另类| 69av视频在线播放| 最近中文字幕免费观看| 国产精品资源网| 久久亚洲国产精品日日av夜夜| 国产福利在线视频| 亚洲综合久久av| 动漫av免费观看| 91精品短视频| 亚洲性xxxx| 国产午夜精品无码一区二区| 日韩黄色一级片| 国产另类自拍| 五月香视频在线观看| 亚洲成a人片在线观看中文| 久久久精品麻豆| 久久精品福利| 久久精品在线播放| 中文字幕黄色片| 国产乱子轮精品视频| 日本成人三级| heyzo在线播放| 91精品在线麻豆| 国产免费一区二区三区网站免费| 欧美va亚洲va日韩∨a综合色| 国产福利精品在线| 日本精品999| 亚洲免费av在线| 久草福利视频在线| 日韩影视高清在线观看| 欧美猛男性生活免费| 日本精品入口免费视频| 96av麻豆蜜桃一区二区| 国产日产欧美一区二区| 日韩成人在线电影| 亚洲天堂第二页| 欧美三级一区二区三区| 国产91精品在线观看| 福利网在线观看| 日韩制服一区| 国产亚洲日本欧美韩国| 免费观看成人毛片| 99在线精品观看| 欧美激情亚洲天堂| 日本精品视频| 日韩中文在线不卡| 曰批又黄又爽免费视频| 国产拍欧美日韩视频二区| 福利在线一区二区| 久久av网站| 久久精品国产一区二区电影| 正在播放亚洲精品| 国产婷婷精品av在线| 少妇高清精品毛片在线视频 | 在线视频国产区| 欧美欧美欧美欧美首页| 欧美人与禽zoz0善交| 日韩高清在线观看| 日韩精品久久一区| 欧美三区四区| 中文字幕亚洲无线码在线一区| 秋霞av一区二区三区| 久久久99精品久久| 激情视频免费网站| 色综合蜜月久久综合网| 成人激情春色网| 黄在线免费观看| 欧美一区二区三区在线看| 成人免费黄色小视频| 国产精品一区二区久激情瑜伽| 中文字幕色一区二区| 韩国一区二区三区视频| 色综合久久久久久中文网| 精品国产无码一区二区| 亚洲福利一区二区三区| 久久午夜夜伦鲁鲁片| 免费亚洲婷婷| 亚洲aⅴ天堂av在线电影软件| 国产精品蜜月aⅴ在线| 久久久精品国产亚洲| 午夜精品无码一区二区三区| 精品久久久国产| 中文字幕成人动漫| 精品亚洲成a人| 成人手机在线播放| 欧美在线关看| 成人福利在线视频| 国产一线二线在线观看 | 欧美xxxxx精品| 美女尤物久久精品| 宅男一区二区三区| 国产毛片久久久| 国产成人鲁鲁免费视频a| 老司机精品视频在线观看6| 精品国产乱码久久久久久蜜臀| 五月天婷婷久久| 亚洲丝袜另类动漫二区| 国产精品日日摸夜夜爽| 日韩av成人高清| 日韩国产成人无码av毛片| 国产在视频线精品视频www666| 成人精品视频在线| 色综合桃花网| 久热精品视频在线| 精品推荐蜜桃传媒| 日韩欧美激情在线| 亚洲第一区av| 亚洲高清中文字幕| 黄色录像免费观看| 久久久久久久久久美女| 18深夜在线观看免费视频| 先锋影音久久久| av动漫在线免费观看| 国产一区不卡| 国产精品三区在线| 成人免费91| 国产成人免费av| 国产传媒在线| 欧美精品午夜视频| 福利成人在线观看| 亚洲成人精品久久| 国产内射老熟女aaaa∵| 在线观看欧美精品| 日韩 欧美 综合| 亚洲香蕉伊在人在线观| 久久久久久久久久97| 久久麻豆一区二区| 黄色免费视频网站| 国产精品一区在线观看你懂的| 九九九在线观看视频| 亚洲欧美日韩在线观看a三区| 日韩在线视频在线| 99热国内精品| 四虎一区二区| 精品视频免费| 久久草.com| 牛牛影视一区二区三区免费看| 亚洲r级在线观看| 国产日本久久| 国产精品一区二区三| 黑人巨大精品| 91成人福利在线| 川上优av中文字幕一区二区| 欧美麻豆久久久久久中文| 黄网页在线观看| 最近2019中文字幕大全第二页| 精品99又大又爽又硬少妇毛片| 亚洲精品成a人在线观看| 高潮毛片7777777毛片| 欧美电影免费提供在线观看| 国产黄a三级三级三级| 3d成人动漫网站| 国产精品久久久久久无人区| 欧美日韩一区不卡| 92久久精品一区二区| 制服丝袜亚洲网站| 99久久精品日本一区二区免费| 91精品国产福利在线观看| 国产日韩一级片| 日韩一二三四区| www久久久久久| 日韩免费视频一区| 亚洲精品国产suv一区| 亚洲精品一区二区三区福利| 国模人体一区二区| 亚洲黄色在线看| 欧美69xxxxx| 在线观看日韩欧美| 黄色网在线免费观看| 欧美国产中文字幕| 欧美在线极品| 国产精品嫩草影院一区二区| 国产成人精品一区二区三区视频 | 国产精品久久..4399| 亚洲人成免费| 毛葺葺老太做受视频| 日韩av一区二区三区四区| 不卡的av中文字幕| 国产乱人伦精品一区二区在线观看| 永久看看免费大片| av影院午夜一区| 亚洲精品成人无码| 国产精品久久国产精麻豆99网站| 顶臀精品视频www| 亚洲成人自拍偷拍| 伊人久久中文字幕| 欧美一区二区性放荡片| 亚洲av成人无码久久精品老人| 亚洲欧美在线免费| 黄色网址在线免费观看| 97精品国产97久久久久久| 国产电影一区二区三区爱妃记| 亚洲尤物视频网| 日本亚洲不卡| 中文精品一区二区三区| 1024精品一区二区三区| 特级丰满少妇一级| 成人免费看黄yyy456| 极品蜜桃臀肥臀-x88av| 亚洲精品va在线观看| 日韩网红少妇无码视频香港| 欧美午夜精品免费| 高h放荡受浪受bl| 中文字幕精品在线视频| ririsao久久精品一区| 国产精品亚洲片夜色在线| 草莓视频一区二区三区| 午夜精品区一区二区三| 99国产成+人+综合+亚洲欧美| 国产精品久久久毛片| 99久久er热在这里只有精品66| 欧洲美女和动交zoz0z| 超碰免费97在线观看| 美女性感视频久久久| 欧美大片1688| 91视频99| 色婷婷一区二区三区| 免费看又黄又无码的网站| 精品一区二区三区免费观看| 亚洲综合自拍网| 亚洲免费观看高清在线观看| 懂色av蜜臀av粉嫩av喷吹| 亚洲精品电影在线| 搞黄网站在线观看| 国产精品爱久久久久久久| 国产区精品视频在线观看豆花| 正在播放91九色| 视频一区中文字幕国产| 国产草草浮力影院| 亚洲黄色小说网站| 亚洲一级黄色大片| 国产亚洲精品一区二555| 亚洲天堂手机| 97神马电影| 伊人久久大香线蕉精品组织观看| 嫩草影院国产精品| 久久久亚洲高清| 欧美啪啪小视频| 日韩激情片免费| av3级在线| 国产chinese精品一区二区| 久久久久av| 成人日韩在线视频| 国产精品久久午夜| 国产裸体美女永久免费无遮挡| 日韩电影大片中文字幕| av女在线播放| 国产精品一区二区不卡视频| 欧美激情视频一区二区三区免费| 亚洲免费黄色录像| 亚洲欧美影音先锋| 中文字幕一区二区三区免费看| 亚洲欧美精品伊人久久| 美脚恋feet久草欧美| 日本一区二区在线视频| 天堂va蜜桃一区二区三区漫画版| 国产黄色网址在线观看| 日韩欧美国产中文字幕| 欧美理论在线观看| 国产成人精品优优av| 日韩激情一区| www.com久久久| 亚洲另类在线制服丝袜| 韩国av免费在线| 高清一区二区三区日本久| 欧美大奶一区二区| 热久久精品免费视频| 国产精品色一区二区三区| 国产绿帽刺激高潮对白| 九九热在线精品视频| 国产精品45p| 国产精品999视频| 久久综合av免费| 少妇无套内谢久久久久| 日韩中文字幕免费| 美女久久精品| 日韩五码在线观看| 久久久久久久久久久电影| 中文字幕日本人妻久久久免费| 久久在线免费观看视频| 盗摄系列偷拍视频精品tp| 国产精品va无码一区二区| 国产精品麻豆视频| 亚洲精品无遮挡| 日韩av日韩在线观看| 欧美残忍xxxx极端| 激情综合激情五月| 色综合久久66| av中文字幕在线播放| 国内视频一区二区| 免费在线观看不卡| 精品无码免费视频| 亚洲视频在线看| 精品视频成人| 可以在线看的av网站| 国产精品久久久久9999吃药| 国精产品一品二品国精品69xx| 国产精品v片在线观看不卡| 中文字幕一区二区av| 国产精品jizz| 91麻豆精品久久久久蜜臀| 国产在线精彩视频| 黑人巨大国产9丨视频| 91理论电影在线观看| 国产欧美日韩成人|