Я рекомендовал бы вычислить это на стороне клиента также. Меньше работы для сервера.
следующее является версией, которую я использую (от Zach Leatherman)
/*
* Javascript Humane Dates
* Copyright (c) 2008 Dean Landolt (deanlandolt.com)
* Re-write by Zach Leatherman (zachleat.com)
*
* Adopted from the John Resig's pretty.js
* at http://ejohn.org/blog/javascript-pretty-date
* and henrah's proposed modification
* at http://ejohn.org/blog/javascript-pretty-date/#comment-297458
*
* Licensed under the MIT license.
*/
function humane_date(date_str){
var time_formats = [
[60, 'just now'],
[90, '1 minute'], // 60*1.5
[3600, 'minutes', 60], // 60*60, 60
[5400, '1 hour'], // 60*60*1.5
[86400, 'hours', 3600], // 60*60*24, 60*60
[129600, '1 day'], // 60*60*24*1.5
[604800, 'days', 86400], // 60*60*24*7, 60*60*24
[907200, '1 week'], // 60*60*24*7*1.5
[2628000, 'weeks', 604800], // 60*60*24*(365/12), 60*60*24*7
[3942000, '1 month'], // 60*60*24*(365/12)*1.5
[31536000, 'months', 2628000], // 60*60*24*365, 60*60*24*(365/12)
[47304000, '1 year'], // 60*60*24*365*1.5
[3153600000, 'years', 31536000], // 60*60*24*365*100, 60*60*24*365
[4730400000, '1 century'] // 60*60*24*365*100*1.5
];
var time = ('' + date_str).replace(/-/g,"/").replace(/[TZ]/g," "),
dt = new Date,
seconds = ((dt - new Date(time) + (dt.getTimezoneOffset() * 60000)) / 1000),
token = ' ago',
i = 0,
format;
if (seconds < 0) {
seconds = Math.abs(seconds);
token = '';
}
while (format = time_formats[i++]) {
if (seconds < format[0]) {
if (format.length == 2) {
return format[1] + (i > 1 ? token : ''); // Conditional so we don't return Just Now Ago
} else {
return Math.round(seconds / format[2]) + ' ' + format[1] + (i > 1 ? token : '');
}
}
}
// overflow for centuries
if(seconds > 4730400000)
return Math.round(seconds / 4730400000) + ' centuries' + token;
return date_str;
};
if(typeof jQuery != 'undefined') {
jQuery.fn.humane_dates = function(){
return this.each(function(){
var date = humane_date(this.title);
if(date && jQuery(this).text() != date) // don't modify the dom if we don't have to
jQuery(this).text(date);
});
};
}
Вы должны использовать% C для вставки символа Юникода:
NSMutableArray *uniArray = [[NSMutableArray alloc] initWithCapacity:0];
int i;
for (i = 32; i < 300; i++) {
NSString *uniString = [NSString stringWithFormat:@"%C", i];
[uniArray addObject:uniString];
}
Другой (лучший?) Способ - использовать stringWithCharacters:
NSMutableArray *uniArray = [[NSMutableArray alloc] initWithCapacity:0];
int i;
for (i = 32; i < 300; i++) {
NSString *uniString = [NSString stringWithCharacters:(unichar *)&i length:1];
[uniArray addObject:uniString];
}
Причина ошибки в том, что за \ u
должны следовать четыре шестнадцатеричные цифры во время компиляции . Вы последовали за ним с помощью «% 04x
», очевидно, с намерением вставить эти четыре шестнадцатеричные цифры во время выполнения , что уже слишком поздно - компилятор давно закончил свою работу к тому времени, и именно компилятор выдает эту ошибку.
Если вам нужен один символ UTF-16, [NSString stringWithCharacters: & длина символа: 1]
. Если это UTF-32, вам нужно будет преобразовать в суррогатные пары, или использовать -initWithData: encoding:
, или попробовать то, что сказал Филипп (я не уверен, правильно ли этот дескриптор UTF-32, но должно).
Еще один вопиющий пример использования Regex:
Требуется RegexKitLite . Использует регулярное выражение (? S).
для разделения строки символов Юникода в NSArray
. .
Оператор регулярного выражения соответствует всем , кроме символов новой строки по умолчанию, а последовательность (? s)
говорит Включите параметр регулярного выражения Dot All
, который позволяет .
для соответствия символу новой строки. Важно, поскольку в приведенном ниже примере мы явно пропускаем не менее \ n
.
#import <Foundation/Foundation.h>
#import "RegexKitLite.h"
// Compile with: gcc -std=gnu99 -o unicodeArray unicodeArray.m RegexKitLite.m -framework Foundation -licucore
int main(int argc, char *argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
unichar uc[1024];
for(NSUInteger idx = 0UL; idx < 1024UL; idx++) { uc[idx] = (unichar)idx; }
NSArray *unicharArray = [[NSString stringWithCharacters:uc length:1024UL] componentsMatchedByRegex:@"(?s)."];
NSLog(@"array: %@", [unicharArray subarrayWithRange:NSMakeRange(32UL, (1024UL - 32UL))]);
[pool release];
return(0);
}