Как я могу сделать unicode символы из целых чисел?

Я рекомендовал бы вычислить это на стороне клиента также. Меньше работы для сервера.

следующее является версией, которую я использую (от 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);
                });
        };
}
5
задан nevan king 22 July 2009 в 06:28
поделиться

4 ответа

Вы должны использовать% 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];
}
7
ответ дан 13 December 2019 в 22:13
поделиться

Причина ошибки в том, что за \ u должны следовать четыре шестнадцатеричные цифры во время компиляции . Вы последовали за ним с помощью «% 04x », очевидно, с намерением вставить эти четыре шестнадцатеричные цифры во время выполнения , что уже слишком поздно - компилятор давно закончил свою работу к тому времени, и именно компилятор выдает эту ошибку.

2
ответ дан 13 December 2019 в 22:13
поделиться

Если вам нужен один символ UTF-16, [NSString stringWithCharacters: & длина символа: 1] . Если это UTF-32, вам нужно будет преобразовать в суррогатные пары, или использовать -initWithData: encoding: , или попробовать то, что сказал Филипп (я не уверен, правильно ли этот дескриптор UTF-32, но должно).

1
ответ дан 13 December 2019 в 22:13
поделиться

Еще один вопиющий пример использования 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);
}
0
ответ дан 13 December 2019 в 22:13
поделиться