View Full Version : تشخیص یونیکد بودن متن
morteza271
چهارشنبه 29 مهر 1394, 10:47 صبح
سلام.
دوستان من یه تابع توی sql میخوام که تشخیص بده متن ورودی دارای کاراکتر یونیکد هست یا نه؟
برای محاسبه تعداد پارت متن(برای پیامک) میخوام.
اگه تابع محاسبه تعداد پارت پیامک رو هم برام بذارین ممنون میشم.
با تشکر پیشاپیش...
یوسف زالی
چهارشنبه 29 مهر 1394, 11:41 صبح
سلام.
این کار رو روی کلاینت راحت تر می تونید انجام بدید.
برای تشخیص هم کافیه ببینید کانورت utf8 متن با خودش یکی می شه یا نه.
morteza271
چهارشنبه 29 مهر 1394, 11:45 صبح
ممنونم از پاسخ تون.
ولی منظورتون از کلاینت چیه؟؟؟
میشه نمونه کد بدین...
ممنون میشم...
یوسف زالی
چهارشنبه 29 مهر 1394, 13:07 عصر
منظورم اینه که با برنامه نویسی انجامش بدید نه با اس کیو ال.
morteza271
چهارشنبه 29 مهر 1394, 13:44 عصر
ممنونم. ولی قبلا هم همینطور بود و برنامه ای که نوشته بودم به همین روال کار میکرد.
ولی سرعتش پایین بود و برای بهینه تر کردن و سرعت بهتر خیلی از توابع رو به سمت sql انتقال دادم و خوشبختانه سرعت خیلی بالا رفت.
ولی الان مشکلم اینه که تعداد پارت پیامکی که من بدست میارم(این تابع رو توی sql نوشتم) با تعداد پارت شرکت اصلی ارسال پیامک تفاوت داره و این باعث متضرر شدن من میشه.
میخوام ببینم دلیلش چیه.
اینم اون تابعی هست که ازش استفاده کردم :
تابع محاسبه پارت پیامک :
CREATE FUNCTION Fn_Get_SMSMessage_Parts
(
@Message NVARCHAR(MAX),
@IsUnicode BIT
)
RETURNS INT
AS
BEGIN
DECLARE @Res INT;
SET @Res = 1;
SET @Message = REPLACE(@Message, CHAR(13)+CHAR(10), CHAR(10));
IF(@IsUnicode = 1)
BEGIN
IF((LEN(@Message) / 70.0) > 1)
BEGIN
SET @Res = LEN(@Message) / 67;
IF((LEN(@Message) % 67) != 0)
SET @Res = @Res + 1;
END
END
ELSE
BEGIN
IF((LEN(@Message) / 160.0) > 1)
BEGIN
SET @Res = LEN(@Message) / 153;
IF((LEN(@Message) % 153) != 0)
SET @Res = @Res + 1;
END
END
RETURN @Res;
END
اینم تابعی هست که چک میکنم ببینم متن پیام یونیکد هست یا نه :
CREATE FUNCTION Fn_TextIsUnicode(
@Message NVARCHAR(MAX)
)
RETURNS BIT
AS
BEGIN
DECLARE @Res BIT;
SET @Res = 0;
DECLARE @MessLen INT;
SET @MessLen = LEN(@Message);
DECLARE @Index INT;
SET @Index = 1;
WHILE(@Index<=@MessLen)
BEGIN
IF(UNICODE(SUBSTRING(@Message, @Index, 1)) > 1000)
BEGIN
SET @Res = 1;
BREAK;
END
SET @Index = @Index + 1;
END
RETURN @Res;
END
الان من متن رو پاس میدم به تابع دومی بعد خروجی این تابع رو با متن اولیه پاس میدم به تابع اولی و تعداد پارت رو محاسبه میکنم.
الان مشکل اینجاست که تعداد پارت های من با با تعداد پارتهای شرکت اصلی متفاوته. در حالیکه تعداد پیامکهای ارسالی هردو برابره.
تعداد پیامک ها هم خیلی زیادن و نمیشه چک کرد که کدوما تعداد پارتشون متفاوته.
لطفا اگه کسی میتونه راهنمایی کنه...
morteza271
چهارشنبه 29 مهر 1394, 21:52 عصر
دوستان کسی نمیدونه معادل این تابع توی sql چی میشه :
mb_strlen($message,'UTF-8');
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.