{"record":{"id":"aa2c0f3fe6a8bd6d","repo":"abpframework/abp","slug":"project-name-cannot-contain-surrogate-or-control-c","errorCode":null,"errorMessage":"Project name cannot contain surrogate or control characters! Specify a different name.","messagePattern":"Project name cannot contain surrogate or control characters! Specify a different name\\.","errorType":"exception","errorClass":"CliUsageException","httpStatus":null,"severity":"error","filePath":"framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ProjectNameValidator.cs","lineNumber":37,"sourceCode":"    private static readonly string[] IllegalKeywords = new[]\r\n    {\r\n            \"MauiBlazor\",\r\n            \"Blazor\"\r\n    };\r\n\r\n    private static void ValidateParentDirectoryString(string projectName)\r\n    {\r\n        if (projectName.Contains(\"..\"))\r\n        {\r\n            throw new CliUsageException(\"Project name cannot contain \\\"..\\\"! Specify a different name.\");\r\n        }\r\n    }\r\n\r\n    private static void ValidateSurrogateOrControlChar(string projectName)\r\n    {\r\n        if (projectName.Any(chr => char.IsControl(chr) || char.IsSurrogate(chr)))\r\n        {\r\n            throw new CliUsageException(\"Project name cannot contain surrogate or control characters! Specify a different name.\");\r\n        }\r\n    }\r\n\r\n    private static void ValidateIllegalProjectName(string projectName)\r\n    {\r\n        foreach (var illegalProjectName in IllegalProjectNames)\r\n        {\r\n            if (projectName.Equals(illegalProjectName, StringComparison.OrdinalIgnoreCase))\r\n            {\r\n                throw new CliUsageException(\"Project name cannot be \\\"\" + illegalProjectName + \"\\\"! Specify a different name.\");\r\n            }\r\n        }\r\n    }\r\n\r\n    private static void ValidateIllegalKeywords(string projectName)\r\n    {\r\n        foreach (var illegalKeyword in IllegalKeywords)\r\n        {\r","sourceCodeStart":19,"sourceCodeEnd":55,"githubUrl":"https://github.com/abpframework/abp/blob/7ed43b1931b9df46a50c0c59148a18645641d0df/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ProjectNameValidator.cs#L19-L55","documentation":"Thrown by ProjectNameValidator.ValidateSurrogateOrControlChar when the project name contains any Unicode control character (char.IsControl) or surrogate (char.IsSurrogate). Surrogates alone are invalid as a filename component, and control characters can corrupt terminals and the filesystem.","triggerScenarios":"Passing a project name with embedded control codes (e.g. tab, newline, BEL) or lone surrogate code points. This is the first validation run by Validate(), before the \"..\" and illegal-name checks.","commonSituations":"Project name read from a config file with stray CR/LF or BOM; name assembled from user input that included an emoji or astral-plane character split into surrogate halves; clipboard paste introducing invisible control characters.","solutions":["Strip control and surrogate characters from the name before passing it; prefer plain ASCII alphanumerics and dots.","Sanitize the source (trim newlines, remove BOM) if the name comes from a file or external input.","Run ProjectNameValidator.Validate() early in custom tooling to fail with a clean message."],"exampleFix":"// before — name from a file with a trailing newline: \"MyApp\\n\"\n// after\nvar name = rawName.Where(c => !char.IsControl(c) && !char.IsSurrogate(c)).ToArray();\nvar cleanName = new string(name);","handlingStrategy":"validation","validationCode":"static string CleanName(string raw)\n{\n    var clean = new string(raw.Where(c => !char.IsControl(c) && !char.IsSurrogate(c)).ToArray());\n    Volo.Abp.Cli.Utils.ProjectNameValidator.Validate(clean);\n    return clean;\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Sanitize names from files/input: strip BOM, CR/LF, control codes, lone surrogates.","Prefer plain ASCII names for projects.","Validate early in any wrapper that programmatically calls `abp new`."],"tags":["abp-cli","project-name","validation","unicode","filesystem"],"backgroundTag":null,"analyzedSha":"7ed43b1931b9df46a50c0c59148a18645641d0df","analyzedAt":"2026-08-13T16:26:11.351Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}