mbstringmodule.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 1,249 行 · 第 1/3 页
JAVA
1,249 行
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * * Free Software Foundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Nam Nguyen */package com.caucho.quercus.lib.i18n;import com.caucho.quercus.QuercusModuleException;import com.caucho.quercus.UnimplementedException;import com.caucho.quercus.annotation.Optional;import com.caucho.quercus.annotation.Reference;import com.caucho.quercus.annotation.VariableArguments;import com.caucho.quercus.env.*;import com.caucho.quercus.lib.MailModule;import com.caucho.quercus.lib.regexp.RegexpModule;import com.caucho.quercus.lib.string.StringModule;import com.caucho.quercus.module.AbstractQuercusModule;import com.caucho.quercus.module.IniDefinitions;import com.caucho.quercus.module.IniDefinition;import com.caucho.util.L10N;import com.caucho.vfs.Encoding;import java.io.UnsupportedEncodingException;import java.nio.charset.Charset;import java.util.Map;import java.util.logging.Logger;public class MbstringModule extends AbstractQuercusModule{ private static final IniDefinitions _iniDefinitions = new IniDefinitions(); private static final Logger log = Logger.getLogger(MbstringModule.class.getName()); private static final L10N L = new L10N(MbstringModule.class); public static final int MB_CASE_UPPER = 0; public static final int MB_CASE_LOWER = 1; public static final int MB_CASE_TITLE = 2; /** * Returns the extensions implemented by the module. */ public String []getLoadedExtensions() { return new String[] { "mbstring" }; } /** * Returns the default php.ini values. */ public IniDefinitions getIniDefinitions() { return _iniDefinitions; } /** * Upper-cases, lower-cases, or capitalizes first letter of words. */ public static StringValue mb_convert_case(Env env, StringValue str, int mode, @Optional("") String encoding) { if (mode == MB_CASE_TITLE) { encoding = getEncoding(env, encoding); StringValue unicodeStr = str.convertToUnicode(env, encoding); unicodeStr = toUpperCaseTitle(env, unicodeStr); return str.create(env, unicodeStr, encoding); } else if (mode == MB_CASE_LOWER) return mb_strtolower(env, str, encoding); else if (mode == MB_CASE_UPPER) return mb_strtoupper(env, str, encoding); else return str; } /** * Converts string of one encoding to another. */ public static StringValue mb_convert_encoding(Env env, StringValue str, String destEncoding, @Optional() String fromEncodings) { // XXX: fallback encoding int tail = fromEncodings.indexOf(',', 1); String srcEncoding; if (tail < 0) srcEncoding = fromEncodings; else srcEncoding = getEncoding(env, fromEncodings.substring(0, tail).trim()); return decodeEncode(env, str, srcEncoding, destEncoding); } /** * Performs Japanese specific charset conversion. */ public static StringValue mb_convert_kana(Env env, StringValue str, @Optional("") String option, @Optional("") String encoding) { throw new UnimplementedException("mb_convert_kana"); } /** * Decodes and then encodes variables. * * XXX: variable arguments to convert. */ @VariableArguments public static StringValue mb_convert_variables(Env env, String toEncoding, String fromEncodings, @Reference Value vars) { // XXX: fallback encoding int tail = fromEncodings.indexOf(',', 1); if (tail < 0) tail = fromEncodings.length(); String srcEncoding; if (tail < 0) srcEncoding = fromEncodings; else srcEncoding = getEncoding(env, fromEncodings.substring(0, tail).trim()); Value decoded = decodeAll(env, vars, srcEncoding); vars.set(encodeAll(env, decoded, toEncoding)); return env.createString(srcEncoding); } /** * Decodes mime field. */ public static Value mb_decode_mimeheader(Env env, StringValue str) { String encoding = getEncoding(env); try { return QuercusMimeUtility.decodeMime(env, str, encoding); } catch (UnsupportedEncodingException e) { throw new QuercusModuleException(e.getMessage()); } } /** * Decodes HTML numeric entity. */ public static StringValue mb_decode_numericentity(Env env, StringValue str, ArrayValue convmap, @Optional String encoding) { throw new UnimplementedException("mb_decode_numericentity"); } /** * Detects encoding of string. */ public static StringValue mb_detect_encoding(Env env, StringValue str, @Optional Value encoding_list, @Optional boolean strict) { throw new UnimplementedException("mb_detect_encoding"); } /** * Specifies order of charsets to test when detecting encoding. */ public static Value mb_detect_order(Env env, Value encoding_list) { throw new UnimplementedException("mb_detect_order"); } /** * Encodes a string into mime. */ public static StringValue mb_encode_mimeheader(Env env, StringValue str, @Optional("") String charset, @Optional("B") String transfer_encoding, @Optional("") String linefeed) { charset = getEncoding(env, charset); try { String mime = QuercusMimeUtility.encodeMimeWord(str.toString(), charset, transfer_encoding, linefeed, 76); return env.createString(mime); } catch (UnsupportedEncodingException e) { throw new QuercusModuleException(e.getMessage()); } } /** * Encodes HTML numeric string entity. */ public static StringValue mb_encode_numericentity(Env env, StringValue str, ArrayValue convmap, @Optional String encoding) { throw new UnimplementedException(); } /** * Returns true if pattern matches a part of string. */ public static BooleanValue mb_ereg_match(Env env, StringValue pattern, StringValue string, @Optional String option) { String encoding = getEncoding(env); pattern = pattern.convertToUnicode(env, encoding); string = string.convertToUnicode(env, encoding); // XXX: option Value val = RegexpModule.ereg(env, pattern, string, null); if (val == BooleanValue.FALSE) return BooleanValue.FALSE; else return BooleanValue.TRUE; } /** * Multibyte version of ereg_replace. */ public static Value mb_ereg_replace(Env env, StringValue pattern, StringValue replacement, StringValue subject, @Optional String option) { String encoding = getEncoding(env); pattern = pattern.convertToUnicode(env, encoding); replacement = replacement.convertToUnicode(env, encoding); subject = subject.convertToUnicode(env, encoding); //XXX: option Value val = RegexpModule.ereg_replace(env, pattern, replacement, subject); return encodeAll(env, val, encoding); } /** * Multibyte version of ereg. */ public static Value mb_ereg(Env env, StringValue pattern, StringValue string, @Optional ArrayValue regs) { return eregImpl(env, pattern, string, regs, true); } /** * Multibyte version of eregi_replace. */ public static Value mb_eregi_replace(Env env, StringValue pattern, StringValue replacement, StringValue subject, @Optional String option) { String encoding = getEncoding(env); pattern = pattern.convertToUnicode(env, encoding); replacement = replacement.convertToUnicode(env, encoding); subject = subject.convertToUnicode(env, encoding); //XXX: option Value val = RegexpModule.eregi_replace(env, pattern, replacement, subject); return encodeAll(env, val, encoding); } /** * Multibyte version of eregi. */ public static Value mb_eregi(Env env, StringValue pattern, StringValue string, @Optional ArrayValue regs) { return eregImpl(env, pattern, string, regs, false); } private static Value eregImpl(Env env, StringValue pattern, StringValue string, ArrayValue regs, boolean isCaseSensitive) { String encoding = getEncoding(env); pattern = pattern.convertToUnicode(env, encoding); string = string.convertToUnicode(env, encoding); if (regs == null) { if (isCaseSensitive) return RegexpModule.ereg(env, pattern, string, null); else return RegexpModule.eregi(env, pattern, string, null); } Value val; Var regVar = new Var(); if (isCaseSensitive) val = RegexpModule.ereg(env, pattern, string, regVar); else val = RegexpModule.eregi(env, pattern, string, regVar); if (regVar.isset()) { regs.clear(); ArrayValue results = regVar.toArrayValue(env); for (Map.Entry<Value,Value> entry : results.entrySet()) { Value bytes = encodeAll(env, entry.getValue(), encoding); regs.put(entry.getKey(), bytes); } val = LongValue.create( regs.get(LongValue.ZERO).toStringValue().length()); } return val; } /** * Gets current position of ereg state object. */ public static LongValue mb_ereg_search_getpos(Env env) { EregSearch ereg = getEreg(env); if (ereg == null) return LongValue.ZERO; return LongValue.create(ereg._position); } /** * Gets the last match of ereg state object from previous matching. */ public static Value mb_ereg_search_getregs(Env env) { EregSearch ereg = getEreg(env); if (ereg == null || ereg._lastMatch == null) return BooleanValue.FALSE; return ereg._lastMatch; } /** * Initializes a ereg state object. */ public static BooleanValue mb_ereg_search_init(Env env, StringValue string, @Optional Value pattern, @Optional Value option) {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?