nodejs/node · critical
1
1
Error message
%s: can not initialize ICU. status = %s
What it means
u_init() failed while opening ICU's core property data, and the failure was anything other than U_FILE_ACCESS_ERROR (which is intentionally ignored because it is expected when bootstrapping ICU from scratch). The actual ICU error code is appended via u_errorName(status). This is the only path in genrb that calls exit(1) immediately, so it bypasses the normal cleanup at the end of main().
Source
Thrown at deps/icu-small/source/tools/genrb/genrb.cpp:297
if (options[FILTERDIR].doesOccur) {
filterDir = options[FILTERDIR].value;
}
if(options[ENCODING].doesOccur) {
encoding = options[ENCODING].value;
}
if(options[ICUDATADIR].doesOccur) {
u_setDataDirectory(options[ICUDATADIR].value);
}
/* Initialize ICU */
u_init(&status);
if (U_FAILURE(status) && status != U_FILE_ACCESS_ERROR) {
/* Note: u_init() will try to open ICU property data.
* failures here are expected when building ICU from scratch.
* ignore them.
*/
fprintf(stderr, "%s: can not initialize ICU. status = %s\n",
argv[0], u_errorName(status));
exit(1);
}
status = U_ZERO_ERROR;
if(options[WRITE_JAVA].doesOccur) {
write_java = true;
outputEnc = options[WRITE_JAVA].value;
}
if(options[WRITE_XLIFF].doesOccur) {
write_xliff = true;
if(options[WRITE_XLIFF].value != nullptr){
xliffOutputFileName = options[WRITE_XLIFF].value;
}
}
if (options[UCADATA].doesOccur) {
#if !UCONFIG_NO_COLLATIONView on GitHub (pinned to 1b2de5e052)
Solutions
- Install or rebuild the ICU data package so u_init() can locate icudt<ver>.dat.
- Verify ICU_DATA / the directory passed via --icudatadir matches the ICU version of the genrb binary (`genrb --version`).
- If building ICU from scratch and this error appears with a non-file-access code, finish the data build step before invoking genrb.
- When embedding genrb, check u_init()'s status yourself and skip genrb on U_FILE_ACCESS_ERROR to mirror the tool's own bootstrap tolerance.
Defensive patterns
Strategy: try-catch
Validate before calling
# Verify ICU data is locatable before running genrb
if ! command -v genrb >/dev/null 2>&1; then echo "genrb not on PATH" >&2; exit 2; fi
genrb --version
# If ICU_DATA is set, confirm icudt*.dat is reachable
if [ -n "${ICU_DATA:-}" ] && ! ls "$ICU_DATA"/icudt*.dat >/dev/null 2>&1; then
echo "ERROR: ICU_DATA=$ICU_DATA has no icudt*.dat" >&2; exit 2
fi Try / catch
# Run genrb, capture exit code, and surface u_init failures distinctly set +e genrb "$@" >genrb.log 2>&1 rc=$? set -e if [ $rc -eq 1 ] && grep -q 'can not initialize ICU' genrb.log; then echo "FATAL: genrb could not initialize ICU - check ICU_DATA / icudt version" >&2 exit $rc fi
Prevention
- Pin the genrb binary and the ICU data package to the same major version.
- In containerized builds, install the ICU data package explicitly rather than relying on transitive deps.
When it happens
Trigger: Running genrb against an ICU build whose data directory points at missing or corrupt icudt*.dat, mixing genrb from one ICU major version with the data tree of another, or a corrupted installation. The diagnostic from u_errorName(status) distinguishes causes (e.g. U_INVALID_FORMAT_ERROR vs U_BUFFER_OVERFLOW_ERROR).
Common situations: Building ICU from source and running genrb before the data .dat package is assembled; installing ICU via a package manager whose data package was split off and not installed; pointing ICU_DATA at a stale directory left by a previous ICU version.
Related errors
- Failed to open %s: %s\n
- Conversion failure at #%X: %s\n
- %s: error in command line argument "%s"\n
- %s: Error: don't specify an encoding (-e) when writing to st
- %s: error in command line argument "%s"\n
AI-assisted analysis of nodejs/node@1b2de5e052 (2026-08-13).
Data as JSON: /api/errors/fe2d6a178836e014.
Report an issue: GitHub.